Fix a reference to window_private->destroyed.
authorOwen Taylor <otaylor@redhat.com>
Sun, 3 Oct 1999 22:12:41 +0000 (22:12 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Sun, 3 Oct 1999 22:12:41 +0000 (22:12 +0000)
Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>

* gtk/gtkwidget.c (gtk_reset_shapes_recurse):
Fix a reference to window_private->destroyed.

* gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
(ugly) setting of an internal GdkWindow member to use
a _slightly_ cleaner macro.

* gdk/gdkprivate.h: Split GdkWindowPrivate into
GdkDrawablePrivate and GdkWindowPrivate.
Add extra macros for accessing GDK_DRAWABLE_ components.

* *.[ch]: Massive adjustments for the above, use the
new macros in a lot of places.

43 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/TODO
gdk/gdk.c
gdk/gdk.h
gdk/gdkcursor.c
gdk/gdkdnd.c
gdk/gdkdraw.c
gdk/gdkdrawable.h
gdk/gdkevents.c
gdk/gdkgc.c
gdk/gdkim.c
gdk/gdkimage.c
gdk/gdkinput.c
gdk/gdkinputcommon.h
gdk/gdkpixmap.c
gdk/gdkprivate.h
gdk/gdkproperty.c
gdk/gdkselection.c
gdk/gdktypes.h
gdk/gdkwindow.c
gdk/gdkwindow.h
gdk/gdkx.h
gdk/x11/gdkcursor-x11.c
gdk/x11/gdkdnd-x11.c
gdk/x11/gdkevents-x11.c
gdk/x11/gdkim-x11.c
gdk/x11/gdkimage-x11.c
gdk/x11/gdkinput-x11.c
gdk/x11/gdkinput.c
gdk/x11/gdkmain-x11.c
gdk/x11/gdkpixmap-x11.c
gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c
gdk/x11/gdkwindow-x11.c
gdk/x11/gdkx.h
gtk/gtkplug.c
gtk/gtkwidget.c

index b413b3ebdd57ef030a3092d26b02414327085b9e..9519b41a989c9b2206766c3848e2509fe646ae36 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_reset_shapes_recurse): 
+       Fix a reference to window_private->destroyed.   
+
+       * gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
+       (ugly) setting of an internal GdkWindow member to use
+       a _slightly_ cleaner macro.
+
+       * gdk/gdkprivate.h: Split GdkWindowPrivate into
+       GdkDrawablePrivate and GdkWindowPrivate.
+       Add extra macros for accessing GDK_DRAWABLE_ components.
+
+       * *.[ch]: Massive adjustments for the above, use the
+       new macros in a lot of places.
+
+Sun Oct  3 15:16:24 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdktypes.h: Make GdkDrawable the base type,
+       not GdkWindow.
+
+Sun Oct  3 15:08:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdraw.c (gdk_drawable_get_data): Added new function.
+
 Sun Oct  3 14:26:15 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gxid* gdk/x11/gxid*: Move files into x11 subdirectory.
index b413b3ebdd57ef030a3092d26b02414327085b9e..9519b41a989c9b2206766c3848e2509fe646ae36 100644 (file)
@@ -1,3 +1,28 @@
+Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_reset_shapes_recurse): 
+       Fix a reference to window_private->destroyed.   
+
+       * gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
+       (ugly) setting of an internal GdkWindow member to use
+       a _slightly_ cleaner macro.
+
+       * gdk/gdkprivate.h: Split GdkWindowPrivate into
+       GdkDrawablePrivate and GdkWindowPrivate.
+       Add extra macros for accessing GDK_DRAWABLE_ components.
+
+       * *.[ch]: Massive adjustments for the above, use the
+       new macros in a lot of places.
+
+Sun Oct  3 15:16:24 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdktypes.h: Make GdkDrawable the base type,
+       not GdkWindow.
+
+Sun Oct  3 15:08:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdraw.c (gdk_drawable_get_data): Added new function.
+
 Sun Oct  3 14:26:15 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gxid* gdk/x11/gxid*: Move files into x11 subdirectory.
index b413b3ebdd57ef030a3092d26b02414327085b9e..9519b41a989c9b2206766c3848e2509fe646ae36 100644 (file)
@@ -1,3 +1,28 @@
+Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_reset_shapes_recurse): 
+       Fix a reference to window_private->destroyed.   
+
+       * gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
+       (ugly) setting of an internal GdkWindow member to use
+       a _slightly_ cleaner macro.
+
+       * gdk/gdkprivate.h: Split GdkWindowPrivate into
+       GdkDrawablePrivate and GdkWindowPrivate.
+       Add extra macros for accessing GDK_DRAWABLE_ components.
+
+       * *.[ch]: Massive adjustments for the above, use the
+       new macros in a lot of places.
+
+Sun Oct  3 15:16:24 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdktypes.h: Make GdkDrawable the base type,
+       not GdkWindow.
+
+Sun Oct  3 15:08:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdraw.c (gdk_drawable_get_data): Added new function.
+
 Sun Oct  3 14:26:15 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gxid* gdk/x11/gxid*: Move files into x11 subdirectory.
index b413b3ebdd57ef030a3092d26b02414327085b9e..9519b41a989c9b2206766c3848e2509fe646ae36 100644 (file)
@@ -1,3 +1,28 @@
+Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_reset_shapes_recurse): 
+       Fix a reference to window_private->destroyed.   
+
+       * gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
+       (ugly) setting of an internal GdkWindow member to use
+       a _slightly_ cleaner macro.
+
+       * gdk/gdkprivate.h: Split GdkWindowPrivate into
+       GdkDrawablePrivate and GdkWindowPrivate.
+       Add extra macros for accessing GDK_DRAWABLE_ components.
+
+       * *.[ch]: Massive adjustments for the above, use the
+       new macros in a lot of places.
+
+Sun Oct  3 15:16:24 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdktypes.h: Make GdkDrawable the base type,
+       not GdkWindow.
+
+Sun Oct  3 15:08:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdraw.c (gdk_drawable_get_data): Added new function.
+
 Sun Oct  3 14:26:15 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gxid* gdk/x11/gxid*: Move files into x11 subdirectory.
index b413b3ebdd57ef030a3092d26b02414327085b9e..9519b41a989c9b2206766c3848e2509fe646ae36 100644 (file)
@@ -1,3 +1,28 @@
+Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_reset_shapes_recurse): 
+       Fix a reference to window_private->destroyed.   
+
+       * gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
+       (ugly) setting of an internal GdkWindow member to use
+       a _slightly_ cleaner macro.
+
+       * gdk/gdkprivate.h: Split GdkWindowPrivate into
+       GdkDrawablePrivate and GdkWindowPrivate.
+       Add extra macros for accessing GDK_DRAWABLE_ components.
+
+       * *.[ch]: Massive adjustments for the above, use the
+       new macros in a lot of places.
+
+Sun Oct  3 15:16:24 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdktypes.h: Make GdkDrawable the base type,
+       not GdkWindow.
+
+Sun Oct  3 15:08:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdraw.c (gdk_drawable_get_data): Added new function.
+
 Sun Oct  3 14:26:15 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gxid* gdk/x11/gxid*: Move files into x11 subdirectory.
index b413b3ebdd57ef030a3092d26b02414327085b9e..9519b41a989c9b2206766c3848e2509fe646ae36 100644 (file)
@@ -1,3 +1,28 @@
+Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_reset_shapes_recurse): 
+       Fix a reference to window_private->destroyed.   
+
+       * gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
+       (ugly) setting of an internal GdkWindow member to use
+       a _slightly_ cleaner macro.
+
+       * gdk/gdkprivate.h: Split GdkWindowPrivate into
+       GdkDrawablePrivate and GdkWindowPrivate.
+       Add extra macros for accessing GDK_DRAWABLE_ components.
+
+       * *.[ch]: Massive adjustments for the above, use the
+       new macros in a lot of places.
+
+Sun Oct  3 15:16:24 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdktypes.h: Make GdkDrawable the base type,
+       not GdkWindow.
+
+Sun Oct  3 15:08:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdraw.c (gdk_drawable_get_data): Added new function.
+
 Sun Oct  3 14:26:15 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gxid* gdk/x11/gxid*: Move files into x11 subdirectory.
index b413b3ebdd57ef030a3092d26b02414327085b9e..9519b41a989c9b2206766c3848e2509fe646ae36 100644 (file)
@@ -1,3 +1,28 @@
+Sun Oct  3 18:13:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_reset_shapes_recurse): 
+       Fix a reference to window_private->destroyed.   
+
+       * gtk/gtkplug.c (gtk_plug_realize): Fix up a direct
+       (ugly) setting of an internal GdkWindow member to use
+       a _slightly_ cleaner macro.
+
+       * gdk/gdkprivate.h: Split GdkWindowPrivate into
+       GdkDrawablePrivate and GdkWindowPrivate.
+       Add extra macros for accessing GDK_DRAWABLE_ components.
+
+       * *.[ch]: Massive adjustments for the above, use the
+       new macros in a lot of places.
+
+Sun Oct  3 15:16:24 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdktypes.h: Make GdkDrawable the base type,
+       not GdkWindow.
+
+Sun Oct  3 15:08:44 1999  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdraw.c (gdk_drawable_get_data): Added new function.
+
 Sun Oct  3 14:26:15 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gxid* gdk/x11/gxid*: Move files into x11 subdirectory.
index 534c0aad90befe028a626c793c7e11f8e7c1a5b1..6f6191d6d6179ae38578a9898dd46873f5fcc2be 100644 (file)
--- a/gdk/TODO
+++ b/gdk/TODO
@@ -1,3 +1,9 @@
+General
+=======
+
+- gdk_pointer_grab() and gdk_keyboard_grab() are logically member
+  functions of GdkWindow.
+
 Dir structure for ports
 =======================
 
index 96e342f62c0b06a9c4b944251ecefe60c1d3dbb6..87b15b6a91c2c5b2081f169134f7f9999458cf43 100644 (file)
--- a/gdk/gdk.c
+++ b/gdk/gdk.c
@@ -47,6 +47,7 @@
 
 #include "gdk.h"
 
+#include "gdkx.h"
 #include "gdkprivate.h"
 #include "gdkinputprivate.h"
 
@@ -493,10 +494,7 @@ gdk_pointer_grab (GdkWindow *        window,
                  GdkCursor *     cursor,
                  guint32         time)
 {
-  /*  From gdkwindow.c */
   gint return_val;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *confine_to_private;
   GdkCursorPrivate *cursor_private;
   guint xevent_mask;
   Window xwindow;
@@ -505,17 +503,17 @@ gdk_pointer_grab (GdkWindow *       window,
   int i;
   
   g_return_val_if_fail (window != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
+  g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
   
-  window_private = (GdkWindowPrivate*) window;
-  confine_to_private = (GdkWindowPrivate*) confine_to;
   cursor_private = (GdkCursorPrivate*) cursor;
   
-  xwindow = window_private->xwindow;
+  xwindow = GDK_DRAWABLE_XID (window);
   
-  if (!confine_to || confine_to_private->destroyed)
+  if (!confine_to || GDK_DRAWABLE_DESTROYED (confine_to))
     xconfine_to = None;
   else
-    xconfine_to = confine_to_private->xwindow;
+    xconfine_to = GDK_DRAWABLE_XID (confine_to);
   
   if (!cursor)
     xcursor = None;
@@ -541,8 +539,8 @@ gdk_pointer_grab (GdkWindow *         window,
   
   if (return_val == Success)
     {
-      if (!window_private->destroyed)
-       return_val = XGrabPointer (window_private->xdisplay,
+      if (!GDK_DRAWABLE_DESTROYED (window))
+       return_val = XGrabPointer (GDK_DRAWABLE_XDISPLAY (window),
                                   xwindow,
                                   owner_events,
                                   xevent_mask,
@@ -555,7 +553,7 @@ gdk_pointer_grab (GdkWindow *         window,
     }
   
   if (return_val == GrabSuccess)
-    gdk_xgrab_window = window_private;
+    gdk_xgrab_window = (GdkWindowPrivate *)window;
   
   return return_val;
 }
@@ -631,17 +629,12 @@ gdk_keyboard_grab (GdkWindow *       window,
                   gint            owner_events,
                   guint32         time)
 {
-  GdkWindowPrivate *window_private;
-  Window xwindow;
-  
   g_return_val_if_fail (window != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
   
-  window_private = (GdkWindowPrivate*) window;
-  xwindow = window_private->xwindow;
-  
-  if (!window_private->destroyed)
-    return XGrabKeyboard (window_private->xdisplay,
-                         xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    return XGrabKeyboard (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window),
                          owner_events,
                          GrabModeAsync, GrabModeAsync,
                          time);
index ed18c73c77f4a435a87101746b3963aeba8e7257..6cf20f5c88dbeb5a5128e740c635da03ece310c6 100644 (file)
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -47,6 +47,8 @@
 #include <gdk/gdkvisual.h>
 #include <gdk/gdkwindow.h>
 
+#include <gdk/gdkcompat.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
index 6431c780ad95fbd8cab96be2b2ca2118b23e417f..04260a2cde91fa0c40395b06d1dfd7eeb8dc0fdc 100644 (file)
@@ -27,6 +27,7 @@
 #include <X11/Xlib.h>
 #include <X11/cursorfont.h>
 
+#include "gdkx.h"
 #include "gdkcursor.h"
 #include "gdkprivate.h"
 
@@ -57,8 +58,8 @@ gdk_cursor_new_from_pixmap (GdkPixmap *source, GdkPixmap *mask, GdkColor *fg, Gd
   Cursor xcursor;
   XColor xfg, xbg;
   
-  source_pixmap = ((GdkPixmapPrivate *) source)->xwindow;
-  mask_pixmap   = ((GdkPixmapPrivate *) mask)->xwindow;
+  source_pixmap = GDK_DRAWABLE_XID (source);
+  mask_pixmap   = GDK_DRAWABLE_XID (mask);
 
   xfg.pixel = fg->pixel;
   xfg.red = fg->red;
index 37882292455a4ee2c4d4a0bb876d9d5a5174efd3..a58da225b1938921b2c991820e22b69f01e559dd 100644 (file)
@@ -2416,9 +2416,8 @@ xdnd_manage_source_filter (GdkDragContext *context,
                           gboolean        add_filter)
 {
   gint old_warnings = 0;       /* quiet gcc */
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
                               
-  gboolean is_foreign = (private->window_type == GDK_WINDOW_FOREIGN);
+  gboolean is_foreign = GDK_DRAWABLE_TYPE (window);
 
   if (is_foreign)
     {
@@ -2426,7 +2425,7 @@ xdnd_manage_source_filter (GdkDragContext *context,
       gdk_error_warnings = 0;
     }
 
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       if (add_filter)
        {
index 3583649fbe8049a1752b12352ecbf2f475d1f067..6c8963a5b2fb38b400882f4d934c82eabcf83db9 100644 (file)
 #include <X11/Xlib.h>
 #include <X11/Xos.h>
 
+#include "gdkx.h"
 #include "gdkdrawable.h"
 #include "gdkprivate.h"
+#include "gdkwindow.h"
 
+/* Manipulation of drawables
+ */
+void          
+gdk_drawable_set_data (GdkDrawable   *drawable,
+                      const gchar   *key,
+                      gpointer       data,
+                      GDestroyNotify destroy_func)
+{
+  g_dataset_set_data_full (drawable, key, data, destroy_func);
+}
+
+void          
+gdk_drawable_get_data (GdkDrawable   *drawable,
+                      const gchar   *key)
+{
+  g_dataset_get_data (drawable, key);
+}
+
+GdkDrawableType
+gdk_drawable_get_type (GdkDrawable *drawable)
+{
+  g_return_val_if_fail (drawable != NULL, (GdkDrawableType) -1);
+  
+  return GDK_DRAWABLE_TYPE (drawable);
+}
+
+void
+gdk_drawable_get_size (GdkDrawable *drawable,
+                      gint        *width,
+                      gint        *height)
+{
+  GdkDrawablePrivate *drawable_private;
+  
+  g_return_if_fail (drawable != NULL);
+  
+  drawable_private = (GdkDrawablePrivate*) drawable;
+  
+  if (width)
+    *width = drawable_private->width;
+  if (height)
+    *height = drawable_private->height;
+}
+
+void
+gdk_drawable_set_colormap (GdkDrawable *drawable,
+                          GdkColormap *colormap)
+{
+  GdkDrawablePrivate *drawable_private;
+  GdkColormapPrivate *colormap_private;
+  
+  g_return_if_fail (drawable != NULL);
+  g_return_if_fail (colormap != NULL);
+  
+  drawable_private = (GdkDrawablePrivate*) drawable;
+  colormap_private = (GdkColormapPrivate*) colormap;
+  
+  if (!GDK_DRAWABLE_DESTROYED (drawable))
+    {
+      if (GDK_IS_WINDOW (drawable))
+       {
+         g_return_if_fail (colormap_private->visual !=
+                           ((GdkColormapPrivate *)(drawable_private->colormap))->visual);
+
+         XSetWindowColormap (GDK_DRAWABLE_XDISPLAY (drawable),
+                             GDK_DRAWABLE_XID (drawable),
+                             colormap_private->xcolormap);
+       }
+
+      if (drawable_private->colormap)
+       gdk_colormap_unref (drawable_private->colormap);
+      drawable_private->colormap = colormap;
+      gdk_colormap_ref (drawable_private->colormap);
+
+      if (GDK_IS_WINDOW (drawable) &&
+         drawable_private->window_type != GDK_WINDOW_TOPLEVEL)
+       gdk_window_add_colormap_windows (drawable);
+    }
+}
+
+GdkColormap*
+gdk_drawable_get_colormap (GdkDrawable *drawable)
+{
+  GdkDrawablePrivate *drawable_private;
+  XWindowAttributes window_attributes;
+  
+  g_return_val_if_fail (drawable != NULL, NULL);
+  drawable_private = (GdkDrawablePrivate*) drawable;
+  
+  if (!GDK_DRAWABLE_DESTROYED (drawable))
+    {
+      if (drawable_private->colormap == NULL &&
+         GDK_IS_WINDOW (drawable))
+       {
+         XGetWindowAttributes (GDK_DRAWABLE_XDISPLAY (drawable),
+                               GDK_DRAWABLE_XID (drawable),
+                               &window_attributes);
+         drawable_private->colormap =  gdk_colormap_lookup (window_attributes.colormap);
+       }
+
+      return drawable_private->colormap;
+    }
+  
+  return NULL;
+}
+
+GdkVisual*
+gdk_drawable_get_visual (GdkDrawable *drawable)
+{
+  GdkColormap *colormap;
+
+  g_return_val_if_fail (drawable != NULL, NULL);
+
+  colormap = gdk_drawable_get_colormap (drawable);
+  return colormap ? gdk_colormap_get_visual (colormap) : NULL;
+}
+
+/* Drawing
+ */
 void
 gdk_draw_point (GdkDrawable *drawable,
                 GdkGC       *gc,
                 gint         x,
                 gint         y)
 {
-  GdkWindowPrivate *drawable_private;
   GdkGCPrivate *gc_private;
 
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
-  XDrawPoint (drawable_private->xdisplay, drawable_private->xwindow,
+  XDrawPoint (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
               gc_private->xgc, x, y);
 }
 
@@ -59,18 +177,16 @@ gdk_draw_line (GdkDrawable *drawable,
               gint         x2,
               gint         y2)
 {
-  GdkWindowPrivate *drawable_private;
   GdkGCPrivate *gc_private;
 
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
-  XDrawLine (drawable_private->xdisplay, drawable_private->xwindow,
+  XDrawLine (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
             gc_private->xgc, x1, y1, x2, y2);
 }
 
@@ -83,14 +199,14 @@ gdk_draw_rectangle (GdkDrawable *drawable,
                    gint         width,
                    gint         height)
 {
-  GdkWindowPrivate *drawable_private;
+  GdkDrawablePrivate *drawable_private;
   GdkGCPrivate *gc_private;
 
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  drawable_private = (GdkDrawablePrivate*) drawable;
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
@@ -100,10 +216,10 @@ gdk_draw_rectangle (GdkDrawable *drawable,
     height = drawable_private->height;
 
   if (filled)
-    XFillRectangle (drawable_private->xdisplay, drawable_private->xwindow,
+    XFillRectangle (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                    gc_private->xgc, x, y, width, height);
   else
-    XDrawRectangle (drawable_private->xdisplay, drawable_private->xwindow,
+    XDrawRectangle (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                    gc_private->xgc, x, y, width, height);
 }
 
@@ -118,14 +234,14 @@ gdk_draw_arc (GdkDrawable *drawable,
              gint         angle1,
              gint         angle2)
 {
-  GdkWindowPrivate *drawable_private;
+  GdkDrawablePrivate *drawable_private;
   GdkGCPrivate *gc_private;
 
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  drawable_private = (GdkDrawablePrivate*) drawable;
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
@@ -135,10 +251,10 @@ gdk_draw_arc (GdkDrawable *drawable,
     height = drawable_private->height;
 
   if (filled)
-    XFillArc (drawable_private->xdisplay, drawable_private->xwindow,
+    XFillArc (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
              gc_private->xgc, x, y, width, height, angle1, angle2);
   else
-    XDrawArc (drawable_private->xdisplay, drawable_private->xwindow,
+    XDrawArc (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
              gc_private->xgc, x, y, width, height, angle1, angle2);
 }
 
@@ -149,7 +265,6 @@ gdk_draw_polygon (GdkDrawable *drawable,
                  GdkPoint    *points,
                  gint         npoints)
 {
-  GdkWindowPrivate *drawable_private;
   GdkGCPrivate *gc_private;
   GdkPoint *local_points = points;
   gint local_npoints = npoints;
@@ -158,14 +273,13 @@ gdk_draw_polygon (GdkDrawable *drawable,
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
   if (filled)
     {
-      XFillPolygon (drawable_private->xdisplay, drawable_private->xwindow,
+      XFillPolygon (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                    gc_private->xgc, (XPoint*) points, npoints, Complex, CoordModeOrigin);
     }
   else
@@ -181,7 +295,7 @@ gdk_draw_polygon (GdkDrawable *drawable,
           local_points[npoints].y = points[0].y;
       }
 
-      XDrawLines (drawable_private->xdisplay, drawable_private->xwindow,
+      XDrawLines (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                  gc_private->xgc,
                  (XPoint*) local_points, local_npoints,
                  CoordModeOrigin);
@@ -205,7 +319,6 @@ gdk_draw_string (GdkDrawable *drawable,
                 gint         y,
                 const gchar *string)
 {
-  GdkWindowPrivate *drawable_private;
   GdkFontPrivate *font_private;
   GdkGCPrivate *gc_private;
 
@@ -214,8 +327,7 @@ gdk_draw_string (GdkDrawable *drawable,
   g_return_if_fail (gc != NULL);
   g_return_if_fail (string != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
   font_private = (GdkFontPrivate*) font;
@@ -223,15 +335,15 @@ gdk_draw_string (GdkDrawable *drawable,
   if (font->type == GDK_FONT_FONT)
     {
       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
-      XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
+      XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), gc_private->xgc, xfont->fid);
       if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
        {
-         XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
+         XDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                       gc_private->xgc, x, y, string, strlen (string));
        }
       else
        {
-         XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
+         XDrawString16 (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                         gc_private->xgc, x, y, (XChar2b *) string,
                         strlen (string) / 2);
        }
@@ -239,7 +351,7 @@ gdk_draw_string (GdkDrawable *drawable,
   else if (font->type == GDK_FONT_FONTSET)
     {
       XFontSet fontset = (XFontSet) font_private->xfont;
-      XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
+      XmbDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                     fontset, gc_private->xgc, x, y, string, strlen (string));
     }
   else
@@ -261,7 +373,6 @@ gdk_draw_text (GdkDrawable *drawable,
               const gchar *text,
               gint         text_length)
 {
-  GdkWindowPrivate *drawable_private;
   GdkFontPrivate *font_private;
   GdkGCPrivate *gc_private;
 
@@ -270,8 +381,7 @@ gdk_draw_text (GdkDrawable *drawable,
   g_return_if_fail (gc != NULL);
   g_return_if_fail (text != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
   font_private = (GdkFontPrivate*) font;
@@ -279,22 +389,22 @@ gdk_draw_text (GdkDrawable *drawable,
   if (font->type == GDK_FONT_FONT)
     {
       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
-      XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
+      XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), gc_private->xgc, xfont->fid);
       if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
        {
-         XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
+         XDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                       gc_private->xgc, x, y, text, text_length);
        }
       else
        {
-         XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
+         XDrawString16 (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                         gc_private->xgc, x, y, (XChar2b *) text, text_length / 2);
        }
     }
   else if (font->type == GDK_FONT_FONTSET)
     {
       XFontSet fontset = (XFontSet) font_private->xfont;
-      XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
+      XmbDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                     fontset, gc_private->xgc, x, y, text, text_length);
     }
   else
@@ -310,7 +420,6 @@ gdk_draw_text_wc (GdkDrawable        *drawable,
                  const GdkWChar *text,
                  gint            text_length)
 {
-  GdkWindowPrivate *drawable_private;
   GdkFontPrivate *font_private;
   GdkGCPrivate *gc_private;
 
@@ -319,8 +428,7 @@ gdk_draw_text_wc (GdkDrawable        *drawable,
   g_return_if_fail (gc != NULL);
   g_return_if_fail (text != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
   font_private = (GdkFontPrivate*) font;
@@ -330,10 +438,10 @@ gdk_draw_text_wc (GdkDrawable      *drawable,
       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
       gchar *text_8bit;
       gint i;
-      XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
+      XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), gc_private->xgc, xfont->fid);
       text_8bit = g_new (gchar, text_length);
       for (i=0; i<text_length; i++) text_8bit[i] = text[i];
-      XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
+      XDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                    gc_private->xgc, x, y, text_8bit, text_length);
       g_free (text_8bit);
     }
@@ -341,7 +449,7 @@ gdk_draw_text_wc (GdkDrawable        *drawable,
     {
       if (sizeof(GdkWChar) == sizeof(wchar_t))
        {
-         XwcDrawString (drawable_private->xdisplay, drawable_private->xwindow,
+         XwcDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                         (XFontSet) font_private->xfont,
                         gc_private->xgc, x, y, (wchar_t *)text, text_length);
        }
@@ -351,7 +459,7 @@ gdk_draw_text_wc (GdkDrawable        *drawable,
          gint i;
          text_wchar = g_new (wchar_t, text_length);
          for (i=0; i<text_length; i++) text_wchar[i] = text[i];
-         XwcDrawString (drawable_private->xdisplay, drawable_private->xwindow,
+         XwcDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable),
                         (XFontSet) font_private->xfont,
                         gc_private->xgc, x, y, text_wchar, text_length);
          g_free (text_wchar);
@@ -372,28 +480,24 @@ gdk_draw_pixmap (GdkDrawable *drawable,
                 gint         width,
                 gint         height)
 {
-  GdkWindowPrivate *drawable_private;
-  GdkWindowPrivate *src_private;
   GdkGCPrivate *gc_private;
 
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (src != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  src_private = (GdkWindowPrivate*) src;
-  if (drawable_private->destroyed || src_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable) || GDK_DRAWABLE_DESTROYED (src))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
   if (width == -1)
-    width = src_private->width;
+    width = ((GdkDrawablePrivate *)src)->width;
   if (height == -1)
-    height = src_private->height;
+    height = ((GdkDrawablePrivate *)src)->height;
 
-  XCopyArea (drawable_private->xdisplay,
-            src_private->xwindow,
-            drawable_private->xwindow,
+  XCopyArea (GDK_DRAWABLE_XDISPLAY (drawable),
+            GDK_DRAWABLE_XID (src),
+            GDK_DRAWABLE_XID (drawable),
             gc_private->xgc,
             xsrc, ysrc,
             width, height,
@@ -436,20 +540,18 @@ gdk_draw_points (GdkDrawable *drawable,
                 GdkPoint    *points,
                 gint         npoints)
 {
-  GdkWindowPrivate *drawable_private;
   GdkGCPrivate *gc_private;
 
   g_return_if_fail (drawable != NULL);
   g_return_if_fail ((points != NULL) && (npoints > 0));
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
-  XDrawPoints (drawable_private->xdisplay,
-              drawable_private->xwindow,
+  XDrawPoints (GDK_DRAWABLE_XDISPLAY (drawable),
+              GDK_DRAWABLE_XID (drawable),
               gc_private->xgc,
               (XPoint *) points,
               npoints,
@@ -462,7 +564,6 @@ gdk_draw_segments (GdkDrawable *drawable,
                   GdkSegment  *segs,
                   gint         nsegs)
 {
-  GdkWindowPrivate *drawable_private;
   GdkGCPrivate *gc_private;
 
   if (nsegs <= 0)
@@ -472,13 +573,12 @@ gdk_draw_segments (GdkDrawable *drawable,
   g_return_if_fail (segs != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
-  XDrawSegments (drawable_private->xdisplay,
-                drawable_private->xwindow,
+  XDrawSegments (GDK_DRAWABLE_XDISPLAY (drawable),
+                GDK_DRAWABLE_XID (drawable),
                 gc_private->xgc,
                 (XSegment *) segs,
                 nsegs);
@@ -490,7 +590,6 @@ gdk_draw_lines (GdkDrawable *drawable,
               GdkPoint    *points,
               gint         npoints)
 {
-  GdkWindowPrivate *drawable_private;
   GdkGCPrivate *gc_private;
 
   if (npoints <= 0)
@@ -500,13 +599,12 @@ gdk_draw_lines (GdkDrawable *drawable,
   g_return_if_fail (points != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   gc_private = (GdkGCPrivate*) gc;
 
-  XDrawLines (drawable_private->xdisplay,
-             drawable_private->xwindow,
+  XDrawLines (GDK_DRAWABLE_XDISPLAY (drawable),
+             GDK_DRAWABLE_XID (drawable),
              gc_private->xgc,
              (XPoint *) points,
              npoints,
index 30b217264a176bc601e69bfc64a101b54c9d5f00..b3286c4823ba098985bf6a4eeb54418885637523 100644 (file)
@@ -34,15 +34,34 @@ typedef enum
   GDK_WINDOW_CHILD,
   GDK_WINDOW_DIALOG,
   GDK_WINDOW_TEMP,
-  GDK_WINDOW_PIXMAP,
+  GDK_DRAWABLE_PIXMAP,
   GDK_WINDOW_FOREIGN
-} GdkWindowType;
+} GdkDrawableType;
 
-struct _GdkWindow
+struct _GdkDrawable
 {
   gpointer user_data;
 };
 
+/* Manipulation of drawables
+ */
+GdkDrawableType gdk_drawable_get_type     (GdkDrawable   *window);
+
+void            gdk_drawable_set_data     (GdkDrawable    *drawable,
+                                          const gchar    *key,
+                                          gpointer       data,
+                                          GDestroyNotify  destroy_func);
+void            gdk_drawable_get_data     (GdkDrawable    *drawable,
+                                          const gchar    *key);
+
+void            gdk_drawable_get_size     (GdkWindow     *drawable,
+                                          gint           *width,
+                                          gint           *height);
+void           gdk_drawable_set_colormap (GdkDrawable    *drawable,
+                                          GdkColormap    *colormap);
+GdkColormap*    gdk_drawable_get_colormap (GdkDrawable   *drawable);
+GdkVisual*      gdk_drawable_get_visual   (GdkDrawable   *drawable);
+
 /* Drawing
  */
 void gdk_draw_point     (GdkDrawable  *drawable,
index 2adc09cb45800c0587965ef850ae378095b2b71e..1738a0dbbeb29f209dc9543372a13d6737e64ff7 100644 (file)
@@ -286,11 +286,7 @@ graphics_expose_predicate (Display  *display,
                           XEvent   *xevent,
                           XPointer  arg)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate*) arg;
-  
-  g_return_val_if_fail (private != NULL, False);
-  
-  if (xevent->xany.window == private->xwindow &&
+  if (xevent->xany.window == GDK_DRAWABLE_XID (arg) &&
       (xevent->xany.type == GraphicsExpose ||
        xevent->xany.type == NoExpose))
     return True;
@@ -1009,6 +1005,8 @@ gdk_event_translate (GdkEvent *event,
     }
   
   window = gdk_window_lookup (xevent->xany.window);
+  /* FIXME: window might be a GdkPixmap!!! */
+  
   window_private = (GdkWindowPrivate *) window;
   
   if (window != NULL)
@@ -1017,7 +1015,7 @@ gdk_event_translate (GdkEvent *event,
   event->any.window = window;
   event->any.send_event = xevent->xany.send_event ? TRUE : FALSE;
   
-  if (window_private && window_private->destroyed)
+  if (window_private && GDK_DRAWABLE_DESTROYED (window))
     {
       if (xevent->type != DestroyNotify)
        return FALSE;
@@ -1040,7 +1038,7 @@ gdk_event_translate (GdkEvent *event,
 
 #ifdef USE_XIM
   if (window == NULL && gdk_xim_window && xevent->type == KeyPress &&
-      !((GdkWindowPrivate *) gdk_xim_window)->destroyed)
+      !GDK_DRAWABLE_DESTROYED (gdk_xim_window))
     {
       /*
        * If user presses a key in Preedit or Status window, keypress event
@@ -1340,7 +1338,7 @@ gdk_event_translate (GdkEvent *event,
       
       /* Tell XInput stuff about it if appropriate */
       if (window_private &&
-         !window_private->destroyed &&
+         !GDK_DRAWABLE_DESTROYED (window) &&
          (window_private->extension_events != 0) &&
          gdk_input_vtable.enter_event)
        gdk_input_vtable.enter_event (&xevent->xcrossing, window);
@@ -1635,9 +1633,9 @@ gdk_event_translate (GdkEvent *event,
       event->any.type = GDK_DESTROY;
       event->any.window = window;
       
-      return_val = window_private && !window_private->destroyed;
+      return_val = window_private && !GDK_DRAWABLE_DESTROYED (window);
       
-      if (window && window_private->xwindow != GDK_ROOT_WINDOW())
+      if (window && GDK_DRAWABLE_XID (window) != GDK_ROOT_WINDOW())
        gdk_window_destroy_notify (window);
       break;
       
@@ -1698,16 +1696,16 @@ gdk_event_translate (GdkEvent *event,
                           xevent->xconfigure.override_redirect,
                           !window
                           ? " (discarding)"
-                          : window_private->window_type == GDK_WINDOW_CHILD
+                          : GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_CHILD
                           ? " (discarding child)"
                           : ""));
       if (window &&
-         !window_private->destroyed &&
+         !GDK_DRAWABLE_DESTROYED (window) &&
          (window_private->extension_events != 0) &&
          gdk_input_vtable.configure_event)
        gdk_input_vtable.configure_event (&xevent->xconfigure, window);
 
-      if (!window || window_private->window_type == GDK_WINDOW_CHILD)
+      if (!window || GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_CHILD)
        return_val = FALSE;
       else
        {
@@ -1718,15 +1716,15 @@ gdk_event_translate (GdkEvent *event,
          
          if (!xevent->xconfigure.x &&
              !xevent->xconfigure.y &&
-             !window_private->destroyed)
+             !GDK_DRAWABLE_DESTROYED (window))
            {
              gint tx = 0;
              gint ty = 0;
              Window child_window = 0;
 
              gdk_error_trap_push ();
-             if (XTranslateCoordinates (window_private->xdisplay,
-                                        window_private->xwindow,
+             if (XTranslateCoordinates (GDK_DRAWABLE_XDISPLAY (window),
+                                        GDK_DRAWABLE_XID (window),
                                         gdk_root_window,
                                         0, 0,
                                         &tx, &ty,
@@ -1748,8 +1746,8 @@ gdk_event_translate (GdkEvent *event,
            }
          window_private->x = event->configure.x;
          window_private->y = event->configure.y;
-         window_private->width = xevent->xconfigure.width;
-         window_private->height = xevent->xconfigure.height;
+         window_private->drawable.width = xevent->xconfigure.width;
+         window_private->drawable.height = xevent->xconfigure.height;
          if (window_private->resize_count > 1)
            window_private->resize_count -= 1;
        }
@@ -1891,7 +1889,7 @@ gdk_event_translate (GdkEvent *event,
       /* something else - (e.g., a Xinput event) */
       
       if (window_private &&
-         !window_private->destroyed &&
+         !window_private->drawable.destroyed &&
          (window_private->extension_events != 0) &&
          gdk_input_vtable.other_event)
        return_val = gdk_input_vtable.other_event(event, xevent, window);
index b5f57b0ba8a52db7d04d78d6f96e41382c839f0f..e8772cfe9bb7ba8fbb47528ee5a16daf6cd17c3e 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "gdkgc.h"
 #include "gdkprivate.h"
-
+#include "gdkx.h"
 
 GdkGC*
 gdk_gc_new (GdkWindow *window)
@@ -42,7 +42,6 @@ gdk_gc_new_with_values (GdkWindow     *window,
                        GdkGCValues     *values,
                        GdkGCValuesMask  values_mask)
 {
-  GdkWindowPrivate *window_private;
   GdkGC *gc;
   GdkGCPrivate *private;
   Window xwindow;
@@ -51,15 +50,14 @@ gdk_gc_new_with_values (GdkWindow   *window,
 
   g_return_val_if_fail (window != NULL, NULL);
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   private = g_new (GdkGCPrivate, 1);
   gc = (GdkGC*) private;
 
-  xwindow = window_private->xwindow;
-  private->xdisplay = window_private->xdisplay;
+  xwindow = GDK_DRAWABLE_XID (window);
+  private->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
   private->ref_count = 1;
 
   xvalues.function = GXcopy;
@@ -157,17 +155,17 @@ gdk_gc_new_with_values (GdkWindow *window,
     }
   if (values_mask & GDK_GC_TILE)
     {
-      xvalues.tile = ((GdkPixmapPrivate*) values->tile)->xwindow;
+      xvalues.tile = GDK_DRAWABLE_XID (values->tile);
       xvalues_mask |= GCTile;
     }
   if (values_mask & GDK_GC_STIPPLE)
     {
-      xvalues.stipple = ((GdkPixmapPrivate*) values->stipple)->xwindow;
+      xvalues.stipple = GDK_DRAWABLE_XID (values->stipple);
       xvalues_mask |= GCStipple;
     }
   if (values_mask & GDK_GC_CLIP_MASK)
     {
-      xvalues.clip_mask = ((GdkPixmapPrivate*) values->clip_mask)->xwindow;
+      xvalues.clip_mask = GDK_DRAWABLE_XID (values->clip_mask);
       xvalues_mask |= GCClipMask;
     }
   if (values_mask & GDK_GC_SUBWINDOW)
@@ -586,7 +584,6 @@ gdk_gc_set_tile (GdkGC         *gc,
                 GdkPixmap *tile)
 {
   GdkGCPrivate *private;
-  GdkPixmapPrivate *pixmap_private;
   Pixmap pixmap;
 
   g_return_if_fail (gc != NULL);
@@ -595,10 +592,7 @@ gdk_gc_set_tile (GdkGC        *gc,
 
   pixmap = None;
   if (tile)
-    {
-      pixmap_private = (GdkPixmapPrivate*) tile;
-      pixmap = pixmap_private->xwindow;
-    }
+    pixmap = GDK_DRAWABLE_XID (tile);
 
   XSetTile (private->xdisplay, private->xgc, pixmap);
 }
@@ -608,7 +602,6 @@ gdk_gc_set_stipple (GdkGC     *gc,
                    GdkPixmap *stipple)
 {
   GdkGCPrivate *private;
-  GdkPixmapPrivate *pixmap_private;
   Pixmap pixmap;
 
   g_return_if_fail (gc != NULL);
@@ -617,10 +610,7 @@ gdk_gc_set_stipple (GdkGC     *gc,
 
   pixmap = None;
   if (stipple)
-    {
-      pixmap_private = (GdkPixmapPrivate*) stipple;
-      pixmap = pixmap_private->xwindow;
-    }
+    pixmap = GDK_DRAWABLE_XID (stipple);
 
   XSetStipple (private->xdisplay, private->xgc, pixmap);
 }
@@ -663,14 +653,7 @@ gdk_gc_set_clip_mask (GdkGC        *gc,
   g_return_if_fail (gc != NULL);
   
   if (mask)
-    {
-      GdkWindowPrivate *mask_private;
-      
-      mask_private = (GdkWindowPrivate*) mask;
-      if (mask_private->destroyed)
-       return;
-      xmask = mask_private->xwindow;
-    }
+    xmask = GDK_DRAWABLE_XID (mask);
   else
     xmask = None;
   
index 020460f329658076412ba878290d8cae5a7778d3..a13d1a6124388a676885f32c9cbfd62da7efb458 100644 (file)
@@ -625,7 +625,7 @@ gdk_ic_new (GdkICAttr *attr, GdkICAttributesType mask)
     }
 
   if (attr->client_window == NULL ||
-      ((GdkWindowPrivate *)attr->client_window)->destroyed)
+      GDK_DRAWABLE_DESTROYED (attr->client_window))
     {
       g_warning ("Client_window is null or already destroyed.\n");
       return NULL;
@@ -1084,7 +1084,7 @@ gdk_ic_set_attr (GdkIC *ic,
   if (mask & GDK_IC_PREEDIT_PIXMAP)
     {
       if (attr->preedit_pixmap != NULL &&
-         ((GdkPixmapPrivate *)attr->preedit_pixmap)->destroyed)
+         GDK_DRAWABLE_DESTROYED (attr->preedit_pixmap))
        {
          g_warning ("Preedit pixmap is already destroyed.\n");
          error |= GDK_IC_PREEDIT_PIXMAP;
@@ -1171,7 +1171,7 @@ gdk_ic_set_attr (GdkIC *ic,
   if (mask & GDK_IC_STATUS_PIXMAP)
     {
       if (attr->status_pixmap != NULL &&
-         ((GdkPixmapPrivate *)attr->status_pixmap)->destroyed)
+         GDK_DRAWABLE_DESTROYED (attr->status_pixmap))
        {
          g_warning ("Preedit pixmap is already destroyed.\n");
          error |= GDK_IC_STATUS_PIXMAP;
index 769727a4b63ea5c40c1988aadd7a46455590b392..4facec7e75042273946b37f41bfb9fe97a5fd895 100644 (file)
@@ -56,6 +56,7 @@
 #include "gdk.h"               /* For gdk_error_trap_* / gdk_flush_* */
 #include "gdkimage.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 
 
 static void gdk_image_put_normal (GdkDrawable *drawable,
@@ -331,12 +332,10 @@ gdk_image_get (GdkWindow *window,
 {
   GdkImage *image;
   GdkImagePrivate *private;
-  GdkWindowPrivate *win_private;
 
   g_return_val_if_fail (window != NULL, NULL);
 
-  win_private = (GdkWindowPrivate *) window;
-  if (win_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   private = g_new (GdkImagePrivate, 1);
@@ -345,7 +344,7 @@ gdk_image_get (GdkWindow *window,
   private->xdisplay = gdk_display;
   private->image_put = gdk_image_put_normal;
   private->ximage = XGetImage (private->xdisplay,
-                              win_private->xwindow,
+                              GDK_DRAWABLE_XID (window),
                               x, y, width, height,
                               AllPlanes, ZPixmap);
 
@@ -455,7 +454,6 @@ gdk_image_put_normal (GdkDrawable *drawable,
                      gint         width,
                      gint         height)
 {
-  GdkWindowPrivate *drawable_private;
   GdkImagePrivate *image_private;
   GdkGCPrivate *gc_private;
 
@@ -463,15 +461,14 @@ gdk_image_put_normal (GdkDrawable *drawable,
   g_return_if_fail (image != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   image_private = (GdkImagePrivate*) image;
   gc_private = (GdkGCPrivate*) gc;
 
   g_return_if_fail (image->type == GDK_IMAGE_NORMAL);
 
-  XPutImage (drawable_private->xdisplay, drawable_private->xwindow,
+  XPutImage (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), 
             gc_private->xgc, image_private->ximage,
             xsrc, ysrc, xdest, ydest, width, height);
 }
@@ -488,7 +485,6 @@ gdk_image_put_shared (GdkDrawable *drawable,
                      gint         height)
 {
 #ifdef USE_SHM
-  GdkWindowPrivate *drawable_private;
   GdkImagePrivate *image_private;
   GdkGCPrivate *gc_private;
 
@@ -496,15 +492,14 @@ gdk_image_put_shared (GdkDrawable *drawable,
   g_return_if_fail (image != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   image_private = (GdkImagePrivate*) image;
   gc_private = (GdkGCPrivate*) gc;
 
   g_return_if_fail (image->type == GDK_IMAGE_SHARED);
 
-  XShmPutImage (drawable_private->xdisplay, drawable_private->xwindow,
+  XShmPutImage (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), 
                gc_private->xgc, image_private->ximage,
                xsrc, ysrc, xdest, ydest, width, height, False);
 #else /* USE_SHM */
index 874a6cafe09fa4f966a1a32d2bb30ff2c647871a..334c3d46d82930d2d7bac7ad3d0cf5cc446458da 100644 (file)
@@ -127,20 +127,20 @@ gdk_input_motion_events (GdkWindow *window,
                         guint32 stop,
                         gint *nevents_return)
 {
-  GdkWindowPrivate *window_private;
   XTimeCoord *xcoords;
   GdkTimeCoord *coords;
   int i;
 
   g_return_val_if_fail (window != NULL, NULL);
-  window_private = (GdkWindowPrivate *) window;
-  if (window_private->destroyed)
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+  
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   if (deviceid == GDK_CORE_POINTER)
     {
-      xcoords = XGetMotionEvents (gdk_display,
-                                 window_private->xwindow,
+      xcoords = XGetMotionEvents (GDK_DRAWABLE_XDISPLAY (window),
+                                 GDK_DRAWABLE_XID (window),
                                  start, stop, nevents_return);
       if (xcoords)
        {
@@ -224,8 +224,10 @@ gdk_input_set_extension_events (GdkWindow *window, gint mask,
   GdkInputWindow *iw;
 
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
 
   if (mode == GDK_EXTENSION_EVENTS_NONE)
index edfc4ebd83ecdadb2acbda9effd2b9d943f3c226..d9bb835b8919c0db66ce7f92eb73d96f80348cc8 100644 (file)
@@ -472,14 +472,14 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
                                 gdouble *x, gdouble *y, gdouble *pressure,
                                 gdouble *xtilt, gdouble *ytilt)
 {
-  GdkWindowPrivate *win_priv;
+  GdkDrawablePrivate *drawable_priv;
 
   int x_axis, y_axis, pressure_axis, xtilt_axis, ytilt_axis;
 
   double device_width, device_height;
   double x_offset, y_offset, x_scale, y_scale;
 
-  win_priv = (GdkWindowPrivate *) input_window->window;
+  drawable_priv = (GdkDrawablePrivate *) input_window->window;
 
   x_axis = gdkdev->axis_for_use[GDK_AXIS_X];
   y_axis = gdkdev->axis_for_use[GDK_AXIS_Y];
@@ -505,26 +505,26 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
       double device_aspect = (device_height*gdkdev->axes[y_axis].resolution) /
        (device_width*gdkdev->axes[x_axis].resolution);
 
-      if (device_aspect * win_priv->width >= win_priv->height)
+      if (device_aspect * drawable_priv->width >= drawable_priv->height)
        {
          /* device taller than window */
-         x_scale = win_priv->width / device_width;
+         x_scale = drawable_priv->width / device_width;
          y_scale = (x_scale * gdkdev->axes[x_axis].resolution)
            / gdkdev->axes[y_axis].resolution;
 
          x_offset = 0;
          y_offset = -(device_height * y_scale - 
-                              win_priv->height)/2;
+                              drawable_priv->height)/2;
        }
       else
        {
          /* window taller than device */
-         y_scale = win_priv->height / device_height;
+         y_scale = drawable_priv->height / device_height;
          x_scale = (y_scale * gdkdev->axes[y_axis].resolution)
            / gdkdev->axes[x_axis].resolution;
 
          y_offset = 0;
-         x_offset = - (device_width * x_scale - win_priv->width)/2;
+         x_offset = - (device_width * x_scale - drawable_priv->width)/2;
        }
     }
   
index 5656b18a93fc0fb1e9d05f9b4f8f9d2099527702..8ee69db9cd1ab5c706fa3171d62581ce8cd11c23 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "gdkpixmap.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 
 typedef struct
 {
@@ -56,36 +57,32 @@ gdk_pixmap_new (GdkWindow *window,
                gint       depth)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *private;
-  GdkWindowPrivate *window_private;
+  GdkDrawablePrivate *private;
 
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);
   g_return_val_if_fail ((width != 0) && (height != 0), NULL);
 
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   if (depth == -1)
-    depth = gdk_window_get_visual (window)->depth;
+    depth = gdk_drawable_get_visual (window)->depth;
 
-  private = g_new0 (GdkWindowPrivate, 1);
+  private = g_new0 (GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap*) private;
 
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
-  private->xwindow = XCreatePixmap (private->xdisplay, window_private->xwindow,
+  private->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+  private->window_type = GDK_DRAWABLE_PIXMAP;
+  private->xwindow = XCreatePixmap (private->xdisplay,
+                                   GDK_DRAWABLE_XID (window),
                                    width, height, depth);
   private->colormap = NULL;
-  private->parent = NULL;
-  private->x = 0;
-  private->y = 0;
   private->width = width;
   private->height = height;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = 0;
 
@@ -101,35 +98,30 @@ gdk_bitmap_create_from_data (GdkWindow   *window,
                             gint         height)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *private;
-  GdkWindowPrivate *window_private;
+  GdkDrawablePrivate *private;
 
   g_return_val_if_fail (data != NULL, NULL);
   g_return_val_if_fail ((width != 0) && (height != 0), NULL);
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
 
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
-  private = g_new0 (GdkWindowPrivate, 1);
+  private = g_new0 (GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap*) private;
 
-  private->parent = NULL;
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
-  private->x = 0;
-  private->y = 0;
+  private->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+  private->window_type = GDK_DRAWABLE_PIXMAP;
   private->width = width;
   private->height = height;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = FALSE;
 
   private->xwindow = XCreateBitmapFromData (private->xdisplay,
-                                           window_private->xwindow,
+                                           GDK_DRAWABLE_XID (window),
                                            (char *)data, width, height);
 
   gdk_xid_table_insert (&private->xwindow, pixmap);
@@ -147,9 +139,9 @@ gdk_pixmap_create_from_data (GdkWindow   *window,
                             GdkColor    *bg)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *private;
-  GdkWindowPrivate *window_private;
+  GdkDrawablePrivate *private;
 
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   g_return_val_if_fail (data != NULL, NULL);
   g_return_val_if_fail (fg != NULL, NULL);
   g_return_val_if_fail (bg != NULL, NULL);
@@ -159,29 +151,24 @@ gdk_pixmap_create_from_data (GdkWindow   *window,
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   if (depth == -1)
-    depth = gdk_window_get_visual (window)->depth;
+    depth = gdk_drawable_get_visual (window)->depth;
 
-  private = g_new0 (GdkWindowPrivate, 1);
+  private = g_new0 (GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap*) private;
 
-  private->parent = NULL;
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
-  private->x = 0;
-  private->y = 0;
+  private->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+  private->window_type = GDK_DRAWABLE_PIXMAP;
   private->width = width;
   private->height = height;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = FALSE;
 
   private->xwindow = XCreatePixmapFromBitmapData (private->xdisplay,
-                                                 window_private->xwindow,
+                                                 GDK_DRAWABLE_XID (window),
                                                  (char *)data, width, height,
                                                  fg->pixel, bg->pixel, depth);
 
@@ -460,8 +447,8 @@ _gdk_pixmap_create_from_xpm (GdkWindow  *window,
   
   if (colormap == NULL)
     {
-      colormap = gdk_window_get_colormap (window);
-      visual = gdk_window_get_visual (window);
+      colormap = gdk_drawable_get_colormap (window);
+      visual = gdk_drawable_get_visual (window);
     }
   else
     visual = ((GdkColormapPrivate *)colormap)->visual;
@@ -760,8 +747,7 @@ GdkPixmap*
 gdk_pixmap_foreign_new (guint32 anid)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *private;
+  GdkDrawablePrivate *private;
   Pixmap xpixmap;
   Window root_return;
   unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret;
@@ -772,29 +758,24 @@ gdk_pixmap_foreign_new (guint32 anid)
   
   /* set the pixmap to the passed in value */
   xpixmap = anid;
-  /* get the root window */
-  window_private = &gdk_root_parent;
 
   /* get information about the Pixmap to fill in the structure for
      the gdk window */
-  if (!XGetGeometry(window_private->xdisplay, xpixmap, &root_return,
+  if (!XGetGeometry(GDK_DISPLAY(),
+                   xpixmap, &root_return,
                    &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
       return NULL;
       
   /* allocate a new gdk pixmap */
-  private = g_new(GdkWindowPrivate, 1);
+  private = g_new(GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap *)private;
 
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
+  private->xdisplay = GDK_DISPLAY();
+  private->window_type = GDK_DRAWABLE_PIXMAP;
   private->xwindow = xpixmap;
   private->colormap = NULL;
-  private->parent = NULL;
-  private->x = 0;
-  private->y = 0;
   private->width = w_ret;
   private->height = h_ret;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = 0;
   
@@ -806,8 +787,9 @@ gdk_pixmap_foreign_new (guint32 anid)
 GdkPixmap*
 gdk_pixmap_ref (GdkPixmap *pixmap)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
+  GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap;
   g_return_val_if_fail (pixmap != NULL, NULL);
+  g_return_val_if_fail (GDK_IS_PIXMAP (private), NULL);
 
   private->ref_count += 1;
   return pixmap;
@@ -816,8 +798,9 @@ gdk_pixmap_ref (GdkPixmap *pixmap)
 void
 gdk_pixmap_unref (GdkPixmap *pixmap)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
+  GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap;
   g_return_if_fail (pixmap != NULL);
+  g_return_if_fail (GDK_IS_PIXMAP (private));
   g_return_if_fail (private->ref_count > 0);
 
   private->ref_count -= 1;
index 091ca440117adb026b879656b77c17810e07e4b7..b7ec3901470c9ba3cd5f8d37c14c85a9f4f7fd7b 100644 (file)
 #include <gdk/gdkvisual.h>
 #include <gdk/gdkwindow.h>
 
-#define gdk_window_lookup(xid)    ((GdkWindow*) gdk_xid_table_lookup (xid))
-#define gdk_pixmap_lookup(xid)    ((GdkPixmap*) gdk_xid_table_lookup (xid))
-#define gdk_font_lookup(xid)      ((GdkFont*) gdk_xid_table_lookup (xid))
-
-
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
 
+#define GDK_DRAWABLE_TYPE(d) (((GdkDrawablePrivate *)d)->window_type)
+#define GDK_IS_WINDOW(d) (GDK_DRAWABLE_TYPE(d) <= GDK_WINDOW_TEMP || \
+                          GDK_DRAWABLE_TYPE(d) == GDK_WINDOW_FOREIGN)
+#define GDK_IS_PIXMAP(d) (GDK_DRAWABLE_TYPE(d) == GDK_DRAWABLE_PIXMAP)
+#define GDK_DRAWABLE_DESTROYED(d) (((GdkDrawablePrivate *)d)->destroyed)
+
+#define gdk_window_lookup(xid)    ((GdkWindow*) gdk_xid_table_lookup (xid))
+#define gdk_pixmap_lookup(xid)    ((GdkPixmap*) gdk_xid_table_lookup (xid))
+#define gdk_font_lookup(xid)      ((GdkFont*) gdk_xid_table_lookup (xid))
 
+typedef struct _GdkDrawablePrivate     GdkDrawablePrivate;
+/* typedef struct _GdkDrawablePrivate     GdkPixmapPrivate; */
 typedef struct _GdkWindowPrivate       GdkWindowPrivate;
-typedef struct _GdkWindowPrivate       GdkPixmapPrivate;
 typedef struct _GdkImagePrivate               GdkImagePrivate;
 typedef struct _GdkGCPrivate          GdkGCPrivate;
 typedef struct _GdkColormapPrivate     GdkColormapPrivate;
@@ -66,21 +71,32 @@ typedef struct _GdkEventFilter             GdkEventFilter;
 typedef struct _GdkClientFilter               GdkClientFilter;
 typedef struct _GdkRegionPrivate       GdkRegionPrivate;
 
+struct _GdkDrawablePrivate
+{
+  GdkDrawable drawable;
+
+  guint8 window_type;
+  guint ref_count;
+
+  guint16 width;
+  guint16 height;
+
+  Window xwindow;
+  Display *xdisplay;
+  GdkColormap *colormap;
+
+  guint destroyed : 2;
+};
 
 struct _GdkWindowPrivate
 {
+  GdkDrawablePrivate drawable;
+  
   GdkWindow window;
   GdkWindow *parent;
-  Window xwindow;
-  Display *xdisplay;
   gint16 x;
   gint16 y;
-  guint16 width;
-  guint16 height;
   guint8 resize_count;
-  guint8 window_type;
-  guint ref_count;
-  guint destroyed : 2;
   guint mapped : 1;
   guint guffaw_gravity : 1;
 
index 5a17abd769396c850c006b3883d124a76bef139b..b91b787d1bb9c9c4252118a8fa493fe2a7123470 100644 (file)
@@ -28,6 +28,7 @@
 #include <X11/Xatom.h>
 #include <string.h>
 
+#include "gdkx.h"
 #include "gdkproperty.h"
 #include "gdkprivate.h"
 
@@ -111,14 +112,11 @@ gdk_property_get (GdkWindow   *window,
 
   if (window)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) window;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (window))
        return FALSE;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_WINDOW_XDISPLAY (window);
+      xwindow = GDK_WINDOW_XWINDOW (window);
     }
   else
     {
@@ -200,14 +198,11 @@ gdk_property_change (GdkWindow   *window,
 
   if (window)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) window;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (window))
        return;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_WINDOW_XDISPLAY (window);
+      xwindow = GDK_WINDOW_XWINDOW (window);
     }
   else
     {
@@ -228,14 +223,11 @@ gdk_property_delete (GdkWindow *window,
 
   if (window)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) window;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (window))
        return;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_WINDOW_XDISPLAY (window);
+      xwindow = GDK_WINDOW_XWINDOW (window);
     }
   else
     {
index ebffc3579caac8dc066ac802513734e35437a57b..e1272f4213a904709905289f862a5edb9a7db9dc 100644 (file)
@@ -45,14 +45,11 @@ gdk_selection_owner_set (GdkWindow *owner,
 
   if (owner)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) owner;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (owner))
        return FALSE;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_DRAWABLE_XDISPLAY (owner);
+      xwindow = GDK_DRAWABLE_XID (owner);
     }
   else
     {
@@ -83,16 +80,11 @@ gdk_selection_convert (GdkWindow *requestor,
                       GdkAtom    target,
                       guint32    time)
 {
-  GdkWindowPrivate *private;
-
-  g_return_if_fail (requestor != NULL);
-
-  private = (GdkWindowPrivate*) requestor;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (requestor))
     return;
 
-  XConvertSelection (private->xdisplay, selection, target,
-                    gdk_selection_property, private->xwindow, time);
+  XConvertSelection (GDK_DRAWABLE_XDISPLAY (requestor), selection, target,
+                    gdk_selection_property, GDK_DRAWABLE_XID (requestor), time);
 }
 
 gint
@@ -101,7 +93,6 @@ gdk_selection_property_get (GdkWindow  *requestor,
                            GdkAtom    *ret_type,
                            gint       *ret_format)
 {
-  GdkWindowPrivate *private;
   gulong nitems;
   gulong nbytes;
   gulong length;
@@ -110,17 +101,18 @@ gdk_selection_property_get (GdkWindow  *requestor,
   guchar *t = NULL;
 
   g_return_val_if_fail (requestor != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (requestor), 0);
 
   /* If retrieved chunks are typically small, (and the ICCCM says the
      should be) it would be a win to try first with a buffer of
      moderate length, to avoid two round trips to the server */
 
-  private = (GdkWindowPrivate*) requestor;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (requestor))
     return 0;
 
   t = NULL;
-  XGetWindowProperty (private->xdisplay, private->xwindow,
+  XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (requestor),
+                     GDK_DRAWABLE_XID (requestor),
                      gdk_selection_property, 0, 0, False,
                      AnyPropertyType, &prop_type, &prop_format,
                      &nitems, &nbytes, &t);
@@ -150,7 +142,8 @@ gdk_selection_property_get (GdkWindow  *requestor,
      protocol, in which case the client has to make sure they'll be
      notified of PropertyChange events _before_ the property is deleted.
      Otherwise there's no guarantee we'll win the race ... */
-  XGetWindowProperty (private->xdisplay, private->xwindow,
+  XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (requestor),
+                     GDK_DRAWABLE_XID (requestor),
                      gdk_selection_property, 0, (nbytes + 3) / 4, False,
                      AnyPropertyType, &prop_type, &prop_format,
                      &nitems, &nbytes, &t);
index 2584e49af3698096291eda036350fa3bbc26a791..e5483a6fe5b41bb96201181471a3a825031b1813 100644 (file)
@@ -82,10 +82,10 @@ typedef struct _GdkImage              GdkImage;
 typedef struct _GdkRegion             GdkRegion;
 typedef struct _GdkVisual             GdkVisual;
 
-typedef struct _GdkWindow             GdkBitmap;
-typedef struct _GdkWindow             GdkDrawable;
-typedef struct _GdkWindow             GdkPixmap;
-typedef struct _GdkWindow             GdkWindow;
+typedef struct _GdkDrawable           GdkDrawable;
+typedef struct _GdkDrawable           GdkBitmap;
+typedef struct _GdkDrawable           GdkPixmap;
+typedef struct _GdkDrawable           GdkWindow;
 
 typedef enum
 {
index ddd5267eace60da25de8622994d8dae9699b55f6..16bdb37d7ce8e77ee25b19c7ccb9bfc0670dab76 100644 (file)
@@ -34,6 +34,7 @@
 #include "gdkwindow.h"
 #include "gdkinputprivate.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 #include "MwmUtil.h"
 
 #include <stdlib.h>
@@ -87,7 +88,7 @@ gdk_window_xid_at (Window   base,
                   gboolean excl_child)
 {
   GdkWindow *window;
-  GdkWindowPrivate *private;
+  GdkDrawablePrivate *private;
   Display *disp;
   Window *list = NULL;
   Window child = 0, parent_win = 0, root_win = 0;
@@ -96,7 +97,7 @@ gdk_window_xid_at (Window   base,
   int wx, wy;
   
   window = (GdkWindow*) &gdk_root_parent;
-  private = (GdkWindowPrivate*) window;
+  private = (GdkDrawablePrivate*) window;
   disp = private->xdisplay;
   if (!XGetGeometry (disp, base, &root_win, &wx, &wy, &ww, &wh, &wb, &wd))
     return 0;
@@ -152,15 +153,15 @@ gdk_window_xid_at_coords (gint     x,
                          gboolean excl_child)
 {
   GdkWindow *window;
-  GdkWindowPrivate *private;
+  GdkDrawablePrivate *private;
   Display *disp;
   Window *list = NULL;
   Window root, child = 0, parent_win = 0, root_win = 0;
   unsigned int num;
   int i;
-  
+
   window = (GdkWindow*) &gdk_root_parent;
-  private = (GdkWindowPrivate*) window;
+  private = (GdkDrawablePrivate*) window;
   disp = private->xdisplay;
   root = private->xwindow;
   num = g_list_length (excludes);
@@ -225,15 +226,15 @@ gdk_window_init (void)
                &x, &y, &width, &height, &border_width, &depth);
   XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
   
-  gdk_root_parent.xwindow = gdk_root_window;
-  gdk_root_parent.xdisplay = gdk_display;
-  gdk_root_parent.window_type = GDK_WINDOW_ROOT;
-  gdk_root_parent.window.user_data = NULL;
-  gdk_root_parent.width = width;
-  gdk_root_parent.height = height;
+  gdk_root_parent.drawable.xwindow = gdk_root_window;
+  gdk_root_parent.drawable.xdisplay = gdk_display;
+  gdk_root_parent.drawable.window_type = GDK_WINDOW_ROOT;
+  gdk_root_parent.drawable.drawable.user_data = NULL;
+  gdk_root_parent.drawable.width = width;
+  gdk_root_parent.drawable.height = height;
   gdk_root_parent.children = NULL;
-  gdk_root_parent.colormap = NULL;
-  gdk_root_parent.ref_count = 1;
+  gdk_root_parent.drawable.colormap = NULL;
+  gdk_root_parent.drawable.ref_count = 1;
   
   gdk_xid_table_insert (&gdk_root_window, &gdk_root_parent);
 }
@@ -268,23 +269,23 @@ gdk_window_new (GdkWindow     *parent,
     parent = (GdkWindow*) &gdk_root_parent;
   
   parent_private = (GdkWindowPrivate*) parent;
-  if (parent_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (parent))
     return NULL;
   
-  xparent = parent_private->xwindow;
-  parent_display = parent_private->xdisplay;
+  xparent = parent_private->drawable.xwindow;
+  parent_display = parent_private->drawable.xdisplay;
   
   private = g_new (GdkWindowPrivate, 1);
   window = (GdkWindow*) private;
   
   private->parent = parent;
   
-  private->xdisplay = parent_display;
-  private->destroyed = FALSE;
+  private->drawable.xdisplay = parent_display;
+  private->drawable.destroyed = FALSE;
   private->mapped = FALSE;
   private->guffaw_gravity = FALSE;
   private->resize_count = 0;
-  private->ref_count = 1;
+  private->drawable.ref_count = 1;
   xattributes_mask = 0;
   
   if (attributes_mask & GDK_WA_X)
@@ -299,9 +300,9 @@ gdk_window_new (GdkWindow     *parent,
   
   private->x = x;
   private->y = y;
-  private->width = (attributes->width > 1) ? (attributes->width) : (1);
-  private->height = (attributes->height > 1) ? (attributes->height) : (1);
-  private->window_type = attributes->window_type;
+  private->drawable.width = (attributes->width > 1) ? (attributes->width) : (1);
+  private->drawable.height = (attributes->height > 1) ? (attributes->height) : (1);
+  private->drawable.window_type = attributes->window_type;
   private->extension_events = FALSE;
   
   private->filters = NULL;
@@ -346,42 +347,42 @@ gdk_window_new (GdkWindow     *parent,
       depth = visual->depth;
       
       if (attributes_mask & GDK_WA_COLORMAP)
-       private->colormap = attributes->colormap;
+       private->drawable.colormap = attributes->colormap;
       else
        {
          if ((((GdkVisualPrivate*)gdk_visual_get_system ())->xvisual) == xvisual)
-           private->colormap = gdk_colormap_get_system ();
+           private->drawable.colormap = gdk_colormap_get_system ();
          else
-           private->colormap = gdk_colormap_new (visual, False);
+           private->drawable.colormap = gdk_colormap_new (visual, False);
        }
       
       xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
       xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
       xattributes_mask |= CWBorderPixel | CWBackPixel;
       
-      switch (private->window_type)
+      switch (private->drawable.window_type)
        {
        case GDK_WINDOW_TOPLEVEL:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          
          xparent = gdk_root_window;
          break;
          
        case GDK_WINDOW_CHILD:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          break;
          
        case GDK_WINDOW_DIALOG:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          
          xparent = gdk_root_window;
          break;
          
        case GDK_WINDOW_TEMP:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          
          xparent = gdk_root_window;
@@ -403,18 +404,18 @@ gdk_window_new (GdkWindow     *parent,
     {
       depth = 0;
       class = InputOnly;
-      private->colormap = NULL;
+      private->drawable.colormap = NULL;
     }
   
-  private->xwindow = XCreateWindow (private->xdisplay, xparent,
-                                   x, y, private->width, private->height,
+  private->drawable.xwindow = XCreateWindow (private->drawable.xdisplay, xparent,
+                                   x, y, private->drawable.width, private->drawable.height,
                                    0, depth, class, xvisual,
                                    xattributes_mask, &xattributes);
   gdk_window_ref (window);
-  gdk_xid_table_insert (&private->xwindow, window);
+  gdk_xid_table_insert (&private->drawable.xwindow, window);
   
-  if (private->colormap)
-    gdk_colormap_ref (private->colormap);
+  if (private->drawable.colormap)
+    gdk_colormap_ref (private->drawable.colormap);
   
   gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
                                  (attributes->cursor) :
@@ -423,18 +424,18 @@ gdk_window_new (GdkWindow     *parent,
   if (parent_private)
     parent_private->children = g_list_prepend (parent_private->children, window);
   
-  switch (private->window_type)
+  switch (private->drawable.window_type)
     {
     case GDK_WINDOW_DIALOG:
-      XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
+      XSetTransientForHint (private->drawable.xdisplay, private->drawable.xwindow, xparent);
     case GDK_WINDOW_TOPLEVEL:
     case GDK_WINDOW_TEMP:
-      XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
+      XSetWMProtocols (private->drawable.xdisplay, private->drawable.xwindow, gdk_wm_window_protocols, 2);
       break;
     case GDK_WINDOW_CHILD:
       if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
-         (private->colormap != gdk_colormap_get_system ()) &&
-         (private->colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
+         (private->drawable.colormap != gdk_colormap_get_system ()) &&
+         (private->drawable.colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
        {
          GDK_NOTE (MISC, g_message ("adding colormap window\n"));
          gdk_window_add_colormap_windows (window);
@@ -447,8 +448,8 @@ gdk_window_new (GdkWindow     *parent,
     }
   
   size_hints.flags = PSize;
-  size_hints.width = private->width;
-  size_hints.height = private->height;
+  size_hints.width = private->drawable.width;
+  size_hints.height = private->drawable.height;
   
   wm_hints.flags = InputHint | StateHint | WindowGroupHint;
   wm_hints.window_group = gdk_leader_window;
@@ -459,14 +460,14 @@ gdk_window_new (GdkWindow     *parent,
    * attention to PSize, and even if they do, is this the
    * correct value???
    */
-  XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
+  XSetWMNormalHints (private->drawable.xdisplay, private->drawable.xwindow, &size_hints);
   
-  XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
+  XSetWMHints (private->drawable.xdisplay, private->drawable.xwindow, &wm_hints);
   
   if (!wm_client_leader_atom)
     wm_client_leader_atom = gdk_atom_intern ("WM_CLIENT_LEADER", FALSE);
   
-  XChangeProperty (private->xdisplay, private->xwindow,
+  XChangeProperty (private->drawable.xdisplay, private->drawable.xwindow,
                   wm_client_leader_atom,
                   XA_WINDOW, 32, PropModeReplace,
                   (guchar*) &gdk_leader_window, 1);
@@ -476,7 +477,7 @@ gdk_window_new (GdkWindow     *parent,
   else
     title = g_get_prgname ();
   
-  XmbSetWMProperties (private->xdisplay, private->xwindow,
+  XmbSetWMProperties (private->drawable.xdisplay, private->drawable.xwindow,
                       title, title,
                       NULL, 0,
                       NULL, NULL, NULL);
@@ -486,7 +487,7 @@ gdk_window_new (GdkWindow     *parent,
       class_hint = XAllocClassHint ();
       class_hint->res_name = attributes->wmclass_name;
       class_hint->res_class = attributes->wmclass_class;
-      XSetClassHint (private->xdisplay, private->xwindow, class_hint);
+      XSetClassHint (private->drawable.xdisplay, private->drawable.xwindow, class_hint);
       XFree (class_hint);
     }
   
@@ -530,21 +531,21 @@ gdk_window_foreign_new (guint32 anid)
   if (parent_private)
     parent_private->children = g_list_prepend (parent_private->children, window);
   
-  private->xwindow = anid;
-  private->xdisplay = gdk_display;
+  private->drawable.xwindow = anid;
+  private->drawable.xdisplay = gdk_display;
   private->x = attrs.x;
   private->y = attrs.y;
-  private->width = attrs.width;
-  private->height = attrs.height;
+  private->drawable.width = attrs.width;
+  private->drawable.height = attrs.height;
   private->resize_count = 0;
-  private->ref_count = 1;
-  private->window_type = GDK_WINDOW_FOREIGN;
-  private->destroyed = FALSE;
+  private->drawable.ref_count = 1;
+  private->drawable.window_type = GDK_WINDOW_FOREIGN;
+  private->drawable.destroyed = FALSE;
   private->mapped = (attrs.map_state != IsUnmapped);
   private->guffaw_gravity = FALSE;
   private->extension_events = 0;
   
-  private->colormap = NULL;
+  private->drawable.colormap = NULL;
   
   private->filters = NULL;
   private->children = NULL;
@@ -552,7 +553,7 @@ gdk_window_foreign_new (guint32 anid)
   window->user_data = NULL;
   
   gdk_window_ref (window);
-  gdk_xid_table_insert (&private->xwindow, window);
+  gdk_xid_table_insert (&private->drawable.xwindow, window);
   
   return window;
 }
@@ -578,14 +579,14 @@ gdk_window_internal_destroy (GdkWindow *window,
   
   private = (GdkWindowPrivate*) window;
   
-  switch (private->window_type)
+  switch (private->drawable.window_type)
     {
     case GDK_WINDOW_TOPLEVEL:
     case GDK_WINDOW_CHILD:
     case GDK_WINDOW_DIALOG:
     case GDK_WINDOW_TEMP:
     case GDK_WINDOW_FOREIGN:
-      if (!private->destroyed)
+      if (!private->drawable.destroyed)
        {
          if (private->parent)
            {
@@ -594,7 +595,7 @@ gdk_window_internal_destroy (GdkWindow *window,
                parent_private->children = g_list_remove (parent_private->children, window);
            }
          
-         if (private->window_type != GDK_WINDOW_FOREIGN)
+         if (GDK_DRAWABLE_TYPE (window) != GDK_WINDOW_FOREIGN)
            {
              children = tmp = private->children;
              private->children = NULL;
@@ -630,7 +631,7 @@ gdk_window_internal_destroy (GdkWindow *window,
              private->filters = NULL;
            }
          
-         if (private->window_type == GDK_WINDOW_FOREIGN)
+         if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
            {
              if (our_destroy && (private->parent != NULL))
                {
@@ -645,26 +646,26 @@ gdk_window_internal_destroy (GdkWindow *window,
                  gdk_window_reparent (window, NULL, 0, 0);
                  
                  xevent.type = ClientMessage;
-                 xevent.window = private->xwindow;
+                 xevent.window = private->drawable.xwindow;
                  xevent.message_type = gdk_wm_protocols;
                  xevent.format = 32;
                  xevent.data.l[0] = gdk_wm_delete_window;
                  xevent.data.l[1] = CurrentTime;
 
-                 XSendEvent (private->xdisplay, private->xwindow,
+                 XSendEvent (private->drawable.xdisplay, private->drawable.xwindow,
                              False, 0, (XEvent *)&xevent);
                  gdk_flush ();
                  gdk_error_trap_pop ();
                }
            }
          else if (xdestroy)
-           XDestroyWindow (private->xdisplay, private->xwindow);
+           XDestroyWindow (private->drawable.xdisplay, private->drawable.xwindow);
          
-         if (private->colormap)
-           gdk_colormap_unref (private->colormap);
+         if (private->drawable.colormap)
+           gdk_colormap_unref (private->drawable.colormap);
          
          private->mapped = FALSE;
-         private->destroyed = TRUE;
+         private->drawable.destroyed = TRUE;
        }
       break;
       
@@ -693,21 +694,17 @@ gdk_window_destroy (GdkWindow *window)
 void
 gdk_window_destroy_notify (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      if (private->window_type != GDK_WINDOW_FOREIGN)
-       g_warning ("GdkWindow %#lx unexpectedly destroyed", private->xwindow);
+      if (GDK_DRAWABLE_TYPE(window) != GDK_WINDOW_FOREIGN)
+       g_warning ("GdkWindow %#lx unexpectedly destroyed", GDK_DRAWABLE_XID (window));
 
       gdk_window_internal_destroy (window, FALSE, FALSE);
     }
   
-  gdk_xid_table_remove (private->xwindow);
+  gdk_xid_table_remove (GDK_DRAWABLE_XID (window));
   gdk_window_unref (window);
 }
 
@@ -717,7 +714,7 @@ gdk_window_ref (GdkWindow *window)
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   g_return_val_if_fail (window != NULL, NULL);
   
-  private->ref_count += 1;
+  private->drawable.ref_count += 1;
   return window;
 }
 
@@ -726,15 +723,14 @@ gdk_window_unref (GdkWindow *window)
 {
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   g_return_if_fail (window != NULL);
-  g_return_if_fail (private->ref_count > 0);
   
-  private->ref_count -= 1;
-  if (private->ref_count == 0)
+  private->drawable.ref_count -= 1;
+  if (private->drawable.ref_count == 0)
     {
-      if (!private->destroyed)
+      if (!private->drawable.destroyed)
        {
-         if (private->window_type == GDK_WINDOW_FOREIGN)
-           gdk_xid_table_remove (private->xwindow);
+         if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
+           gdk_xid_table_remove (private->drawable.xwindow);
          else
            g_warning ("losing last reference to undestroyed window\n");
        }
@@ -751,11 +747,11 @@ gdk_window_show (GdkWindow *window)
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+  if (!private->drawable.destroyed)
     {
       private->mapped = TRUE;
-      XRaiseWindow (private->xdisplay, private->xwindow);
-      XMapWindow (private->xdisplay, private->xwindow);
+      XRaiseWindow (private->drawable.xdisplay, private->drawable.xwindow);
+      XMapWindow (private->drawable.xdisplay, private->drawable.xwindow);
     }
 }
 
@@ -767,10 +763,10 @@ gdk_window_hide (GdkWindow *window)
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+  if (!private->drawable.destroyed)
     {
       private->mapped = FALSE;
-      XUnmapWindow (private->xdisplay, private->xwindow);
+      XUnmapWindow (private->drawable.xdisplay, private->drawable.xwindow);
     }
 }
 
@@ -782,8 +778,8 @@ gdk_window_withdraw (GdkWindow *window)
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
-    XWithdrawWindow (private->xdisplay, private->xwindow, 0);
+  if (!private->drawable.destroyed)
+    XWithdrawWindow (private->drawable.xdisplay, private->drawable.xwindow, 0);
 }
 
 void
@@ -796,11 +792,11 @@ gdk_window_move (GdkWindow *window,
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+  if (!private->drawable.destroyed)
     {
-      XMoveWindow (private->xdisplay, private->xwindow, x, y);
+      XMoveWindow (private->drawable.xdisplay, private->drawable.xwindow, x, y);
       
-      if (private->window_type == GDK_WINDOW_CHILD)
+      if (private->drawable.window_type == GDK_WINDOW_CHILD)
        {
          private->x = x;
          private->y = y;
@@ -816,26 +812,29 @@ gdk_window_resize (GdkWindow *window,
   GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   if (width < 1)
     width = 1;
   if (height < 1)
     height = 1;
-  
+
   private = (GdkWindowPrivate*) window;
   
-  if (!private->destroyed &&
+  if (!private->drawable.destroyed &&
       ((private->resize_count > 0) ||
-       (private->width != (guint16) width) ||
-       (private->height != (guint16) height)))
+       (private->drawable.width != (guint16) width) ||
+       (private->drawable.height != (guint16) height)))
     {
-      XResizeWindow (private->xdisplay, private->xwindow, width, height);
+      XResizeWindow (GDK_DRAWABLE_XDISPLAY (private),
+                    GDK_DRAWABLE_XID (private),
+                    width, height);
       private->resize_count += 1;
       
-      if (private->window_type == GDK_WINDOW_CHILD)
+      if (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
        {
-         private->width = width;
-         private->height = height;
+         private->drawable.width = width;
+         private->drawable.height = height;
        }
     }
 }
@@ -850,16 +849,20 @@ gdk_window_move_resize (GdkWindow *window,
   GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
-  
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   if (width < 1)
     width = 1;
   if (height < 1)
     height = 1;
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
+      XMoveResizeWindow (GDK_DRAWABLE_XDISPLAY (window),
+                        GDK_DRAWABLE_XID (window),
+                        x, y, width, height);
       
       if (private->guffaw_gravity)
        {
@@ -875,12 +878,12 @@ gdk_window_move_resize (GdkWindow *window,
            }
        }
       
-      if (private->window_type == GDK_WINDOW_CHILD)
+      if (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
        {
          private->x = x;
          private->y = y;
-         private->width = width;
-         private->height = height;
+         private->drawable.width = width;
+         private->drawable.height = height;
        }
     }
 }
@@ -896,6 +899,9 @@ gdk_window_reparent (GdkWindow *window,
   GdkWindowPrivate *old_parent_private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  g_return_if_fail (new_parent != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (new_parent));
   
   if (!new_parent)
     new_parent = (GdkWindow*) &gdk_root_parent;
@@ -904,10 +910,10 @@ gdk_window_reparent (GdkWindow *window,
   old_parent_private = (GdkWindowPrivate*)window_private->parent;
   parent_private = (GdkWindowPrivate*) new_parent;
   
-  if (!window_private->destroyed && !parent_private->destroyed)
-    XReparentWindow (window_private->xdisplay,
-                    window_private->xwindow,
-                    parent_private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window) && !GDK_DRAWABLE_DESTROYED (new_parent))
+    XReparentWindow (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    GDK_DRAWABLE_XID (new_parent),
                     x, y);
   
   window_private->parent = new_parent;
@@ -926,14 +932,11 @@ gdk_window_reparent (GdkWindow *window,
 void
 gdk_window_clear (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XClearWindow (private->xdisplay, private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XClearWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window));
 }
 
 void
@@ -943,14 +946,11 @@ gdk_window_clear_area (GdkWindow *window,
                       gint       width,
                       gint       height)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XClearArea (private->xdisplay, private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XClearArea (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                x, y, width, height, False);
 }
 
@@ -961,76 +961,32 @@ gdk_window_clear_area_e (GdkWindow *window,
                         gint       width,
                         gint       height)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XClearArea (private->xdisplay, private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XClearArea (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                x, y, width, height, True);
 }
 
-void
-gdk_window_copy_area (GdkWindow    *window,
-                     GdkGC        *gc,
-                     gint          x,
-                     gint          y,
-                     GdkWindow    *source_window,
-                     gint          source_x,
-                     gint          source_y,
-                     gint          width,
-                     gint          height)
-{
-  GdkWindowPrivate *src_private;
-  GdkWindowPrivate *dest_private;
-  GdkGCPrivate *gc_private;
-  
-  g_return_if_fail (window != NULL);
-  g_return_if_fail (gc != NULL);
-  
-  if (source_window == NULL)
-    source_window = window;
-  
-  src_private = (GdkWindowPrivate*) source_window;
-  dest_private = (GdkWindowPrivate*) window;
-  gc_private = (GdkGCPrivate*) gc;
-  
-  if (!src_private->destroyed && !dest_private->destroyed)
-    {
-      XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
-                gc_private->xgc,
-                source_x, source_y,
-                width, height,
-                x, y);
-    }
-}
-
 void
 gdk_window_raise (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XRaiseWindow (private->xdisplay, private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XRaiseWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window));
 }
 
 void
 gdk_window_lower (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XLowerWindow (private->xdisplay, private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XLowerWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window));
 }
 
 void
@@ -1052,13 +1008,12 @@ gdk_window_set_hints (GdkWindow *window,
                      gint       max_height,
                      gint       flags)
 {
-  GdkWindowPrivate *private;
   XSizeHints size_hints;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   size_hints.flags = 0;
@@ -1087,7 +1042,9 @@ gdk_window_set_hints (GdkWindow *window,
   /* FIXME: Would it be better to delete this property of
    *        flags == 0? It would save space on the server
    */
-  XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
+  XSetWMNormalHints (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    &size_hints);
 }
 
 void 
@@ -1095,13 +1052,12 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
                               GdkGeometry    *geometry,
                               GdkWindowHints  geom_mask)
 {
-  GdkWindowPrivate *private;
   XSizeHints size_hints;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   size_hints.flags = 0;
@@ -1173,20 +1129,21 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
   /* FIXME: Would it be better to delete this property of
    *        geom_mask == 0? It would save space on the server
    */
-  XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
+  XSetWMNormalHints (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    &size_hints);
 }
 
 void
 gdk_window_set_title (GdkWindow   *window,
                      const gchar *title)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
-    XmbSetWMProperties (private->xdisplay, private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XmbSetWMProperties (GDK_DRAWABLE_XDISPLAY (window),
+                       GDK_DRAWABLE_XID (window),
                        title, title, NULL, 0, NULL, NULL, NULL);
 }
 
@@ -1194,19 +1151,19 @@ void
 gdk_window_set_role (GdkWindow   *window,
                     const gchar *role)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
-  
-  private = (GdkWindowPrivate*) window;
-  
-  if (role)
-    XChangeProperty (private->xdisplay, private->xwindow,
-                    gdk_atom_intern ("WM_WINDOW_ROLE", FALSE), XA_STRING,
-                    8, PropModeReplace, role, strlen (role));
-  else
-    XDeleteProperty (private->xdisplay, private->xwindow,
-                    gdk_atom_intern ("WM_WINDOW_ROLE", FALSE));
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    {
+      if (role)
+       XChangeProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
+                        gdk_atom_intern ("WM_WINDOW_ROLE", FALSE), XA_STRING,
+                        8, PropModeReplace, role, strlen (role));
+      else
+       XDeleteProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
+                        gdk_atom_intern ("WM_WINDOW_ROLE", FALSE));
+    }
 }
 
 void          
@@ -1217,26 +1174,27 @@ gdk_window_set_transient_for (GdkWindow *window,
   GdkWindowPrivate *parent_private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   private = (GdkWindowPrivate*) window;
   parent_private = (GdkWindowPrivate*) parent;
   
-  if (!private->destroyed && !parent_private->destroyed)
-    XSetTransientForHint (private->xdisplay, 
-                         private->xwindow, parent_private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window) && !GDK_DRAWABLE_DESTROYED (parent))
+    XSetTransientForHint (GDK_DRAWABLE_XDISPLAY (window), 
+                         GDK_DRAWABLE_XID (window),
+                         GDK_DRAWABLE_XID (parent));
 }
 
 void
 gdk_window_set_background (GdkWindow *window,
                           GdkColor  *color)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
-    XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XSetWindowBackground (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window), color->pixel);
 }
 
 void
@@ -1244,38 +1202,34 @@ gdk_window_set_back_pixmap (GdkWindow *window,
                            GdkPixmap *pixmap,
                            gint       parent_relative)
 {
-  GdkWindowPrivate *window_private;
-  GdkPixmapPrivate *pixmap_private;
   Pixmap xpixmap;
   
   g_return_if_fail (window != NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  pixmap_private = (GdkPixmapPrivate*) pixmap;
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   if (pixmap)
-    xpixmap = pixmap_private->xwindow;
+    xpixmap = GDK_DRAWABLE_XID (pixmap);
   else
     xpixmap = None;
   
   if (parent_relative)
     xpixmap = ParentRelative;
   
-  if (!window_private->destroyed)
-    XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XSetWindowBackgroundPixmap (GDK_DRAWABLE_XDISPLAY (window),
+                               GDK_DRAWABLE_XID (window), xpixmap);
 }
 
 void
 gdk_window_set_cursor (GdkWindow *window,
                       GdkCursor *cursor)
 {
-  GdkWindowPrivate *window_private;
   GdkCursorPrivate *cursor_private;
   Cursor xcursor;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  window_private = (GdkWindowPrivate*) window;
   cursor_private = (GdkCursorPrivate*) cursor;
   
   if (!cursor)
@@ -1283,37 +1237,10 @@ gdk_window_set_cursor (GdkWindow *window,
   else
     xcursor = cursor_private->xcursor;
   
-  if (!window_private->destroyed)
-    XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
-}
-
-void
-gdk_window_set_colormap (GdkWindow   *window,
-                        GdkColormap *colormap)
-{
-  GdkWindowPrivate *window_private;
-  GdkColormapPrivate *colormap_private;
-  
-  g_return_if_fail (window != NULL);
-  g_return_if_fail (colormap != NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  colormap_private = (GdkColormapPrivate*) colormap;
-  
-  if (!window_private->destroyed)
-    {
-      XSetWindowColormap (window_private->xdisplay,
-                         window_private->xwindow,
-                         colormap_private->xcolormap);
-      
-      if (window_private->colormap)
-       gdk_colormap_unref (window_private->colormap);
-      window_private->colormap = colormap;
-      gdk_colormap_ref (window_private->colormap);
-      
-      if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
-       gdk_window_add_colormap_windows (window);
-    }
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XDefineCursor (GDK_DRAWABLE_XDISPLAY (window),
+                  GDK_DRAWABLE_XID (window),
+                  xcursor);
 }
 
 void
@@ -1333,7 +1260,6 @@ gdk_window_get_geometry (GdkWindow *window,
                         gint      *height,
                         gint      *depth)
 {
-  GdkWindowPrivate *window_private;
   Window root;
   gint tx;
   gint ty;
@@ -1342,14 +1268,15 @@ gdk_window_get_geometry (GdkWindow *window,
   guint tborder_width;
   guint tdepth;
   
-  if (!window)
-    window = (GdkWindow*) &gdk_root_parent;
+  g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
   
-  window_private = (GdkWindowPrivate*) window;
+  if (!window)
+    window = (GdkWindow *) &gdk_root_parent;
   
-  if (!window_private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      XGetGeometry (window_private->xdisplay, window_private->xwindow,
+      XGetGeometry (GDK_DRAWABLE_XDISPLAY (window),
+                   GDK_DRAWABLE_XID (window),
                    &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
       
       if (x)
@@ -1373,6 +1300,7 @@ gdk_window_get_position (GdkWindow *window,
   GdkWindowPrivate *window_private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   window_private = (GdkWindowPrivate*) window;
   
@@ -1382,97 +1310,11 @@ gdk_window_get_position (GdkWindow *window,
     *y = window_private->y;
 }
 
-void
-gdk_window_get_size (GdkWindow *window,
-                    gint       *width,
-                    gint       *height)
-{
-  GdkWindowPrivate *window_private;
-  
-  g_return_if_fail (window != NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  
-  if (width)
-    *width = window_private->width;
-  if (height)
-    *height = window_private->height;
-}
-
-GdkVisual*
-gdk_window_get_visual (GdkWindow *window)
-{
-  GdkWindowPrivate *window_private;
-  XWindowAttributes window_attributes;
-  
-  g_return_val_if_fail (window != NULL, NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  /* Huh? ->parent is never set for a pixmap. We should just return
-   * null immeditately
-   */
-  while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
-    window_private = (GdkWindowPrivate*) window_private->parent;
-  
-  if (window_private && !window_private->destroyed)
-    {
-      if (window_private->colormap == NULL)
-       {
-         XGetWindowAttributes (window_private->xdisplay,
-                               window_private->xwindow,
-                               &window_attributes);
-         return gdk_visual_lookup (window_attributes.visual);
-       }
-      else
-       return ((GdkColormapPrivate *)window_private->colormap)->visual;
-    }
-  
-  return NULL;
-}
-
-GdkColormap*
-gdk_window_get_colormap (GdkWindow *window)
-{
-  GdkWindowPrivate *window_private;
-  XWindowAttributes window_attributes;
-  
-  g_return_val_if_fail (window != NULL, NULL);
-  window_private = (GdkWindowPrivate*) window;
-  
-  g_return_val_if_fail (window_private->window_type != GDK_WINDOW_PIXMAP, NULL);
-  if (!window_private->destroyed)
-    {
-      if (window_private->colormap == NULL)
-       {
-         XGetWindowAttributes (window_private->xdisplay,
-                               window_private->xwindow,
-                               &window_attributes);
-         return gdk_colormap_lookup (window_attributes.colormap);
-       }
-      else
-       return window_private->colormap;
-    }
-  
-  return NULL;
-}
-
-GdkWindowType
-gdk_window_get_type (GdkWindow *window)
-{
-  GdkWindowPrivate *window_private;
-  
-  g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
-  
-  window_private = (GdkWindowPrivate*) window;
-  return window_private->window_type;
-}
-
 gint
 gdk_window_get_origin (GdkWindow *window,
                       gint      *x,
                       gint      *y)
 {
-  GdkWindowPrivate *private;
   gint return_val;
   Window child;
   gint tx = 0;
@@ -1480,12 +1322,10 @@ gdk_window_get_origin (GdkWindow *window,
   
   g_return_val_if_fail (window != NULL, 0);
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      return_val = XTranslateCoordinates (private->xdisplay,
-                                         private->xwindow,
+      return_val = XTranslateCoordinates (GDK_DRAWABLE_XDISPLAY (window),
+                                         GDK_DRAWABLE_XID (window),
                                          gdk_root_window,
                                          0, 0, &tx, &ty,
                                          &child);
@@ -1507,7 +1347,6 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
                                    gint      *x,
                                    gint      *y)
 {
-  GdkWindowPrivate *private;
   gboolean return_val = FALSE;
   gint num_children, format_return;
   Window win, *child, parent, root;
@@ -1519,16 +1358,15 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
   guchar *data_return;
   
   g_return_val_if_fail (window != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       if (!atom)
-       atom = XInternAtom (private->xdisplay, "ENLIGHTENMENT_DESKTOP", False);
-      win = private->xwindow;
+       atom = gdk_atom_intern ("ENLIGHTENMENT_DESKTOP", FALSE);
+      win = GDK_DRAWABLE_XID (window);
       
-      while (XQueryTree (private->xdisplay, win, &root, &parent,
+      while (XQueryTree (GDK_DRAWABLE_XDISPLAY (window), win, &root, &parent,
                         &child, (unsigned int *)&num_children))
        {
          if ((child) && (num_children > 0))
@@ -1543,7 +1381,7 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
            break;
          
          data_return = NULL;
-         XGetWindowProperty (private->xdisplay, win, atom, 0, 0,
+         XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (window), win, atom, 0, 0,
                              False, XA_CARDINAL, &type_return, &format_return,
                              &number_return, &bytes_after_return, &data_return);
          if (type_return == XA_CARDINAL)
@@ -1553,8 +1391,8 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
            }
        }
       
-      return_val = XTranslateCoordinates (private->xdisplay,
-                                         private->xwindow,
+      return_val = XTranslateCoordinates (GDK_DRAWABLE_XDISPLAY (window),
+                                         GDK_DRAWABLE_XID (window),
                                          win,
                                          0, 0, &tx, &ty,
                                          &root);
@@ -1581,25 +1419,27 @@ gdk_window_get_root_origin (GdkWindow *window,
   unsigned int nchildren;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   private = (GdkWindowPrivate*) window;
   if (x)
     *x = 0;
   if (y)
     *y = 0;
-  if (private->destroyed)
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   while (private->parent && ((GdkWindowPrivate*) private->parent)->parent)
     private = (GdkWindowPrivate*) private->parent;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
-  xparent = private->xwindow;
+  xparent = GDK_DRAWABLE_XID (window);
   do
     {
       xwindow = xparent;
-      if (!XQueryTree (private->xdisplay, xwindow,
+      if (!XQueryTree (GDK_DRAWABLE_XDISPLAY (window), xwindow,
                       &root, &xparent,
                       &children, &nchildren))
        return;
@@ -1614,7 +1454,7 @@ gdk_window_get_root_origin (GdkWindow *window,
       unsigned int ww, wh, wb, wd;
       int wx, wy;
       
-      if (XGetGeometry (private->xdisplay, xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
+      if (XGetGeometry (GDK_DRAWABLE_XDISPLAY (window), xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
        {
          if (x)
            *x = wx;
@@ -1630,7 +1470,6 @@ gdk_window_get_pointer (GdkWindow       *window,
                        gint            *y,
                        GdkModifierType *mask)
 {
-  GdkWindowPrivate *private;
   GdkWindow *return_val;
   Window root;
   Window child;
@@ -1638,16 +1477,17 @@ gdk_window_get_pointer (GdkWindow       *window,
   int winx = 0;
   int winy = 0;
   unsigned int xmask = 0;
+
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
   
-  private = (GdkWindowPrivate*) window;
-  
   return_val = NULL;
-  if (!private->destroyed &&
-      XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
-                    &rootx, &rooty, &winx, &winy, &xmask))
+  if (!GDK_DRAWABLE_DESTROYED (window) &&
+      XQueryPointer (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    &root, &child, &rootx, &rooty, &winx, &winy, &xmask))
     {
       if (child)
        return_val = gdk_window_lookup (child);
@@ -1678,20 +1518,20 @@ gdk_window_at_pointer (gint *win_x,
   
   private = &gdk_root_parent;
   
-  xwindow = private->xwindow;
+  xwindow = private->drawable.xwindow;
   
-  XGrabServer (private->xdisplay);
+  XGrabServer (private->drawable.xdisplay);
   while (xwindow)
     {
       xwindow_last = xwindow;
-      XQueryPointer (private->xdisplay,
+      XQueryPointer (private->drawable.xdisplay,
                     xwindow,
                     &root, &xwindow,
                     &rootx, &rooty,
                     &winx, &winy,
                     &xmask);
     }
-  XUngrabServer (private->xdisplay);
+  XUngrabServer (private->drawable.xdisplay);
   
   window = gdk_window_lookup (xwindow_last);
   
@@ -1707,6 +1547,7 @@ GdkWindow*
 gdk_window_get_parent (GdkWindow *window)
 {
   g_return_val_if_fail (window != NULL, NULL);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
   
   return ((GdkWindowPrivate*) window)->parent;
 }
@@ -1717,22 +1558,18 @@ gdk_window_get_toplevel (GdkWindow *window)
   GdkWindowPrivate *private;
   
   g_return_val_if_fail (window != NULL, NULL);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+  private = (GdkWindowPrivate *)window;
+  while (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
+    private = (GdkWindowPrivate *)private->parent;
   
-  private = (GdkWindowPrivate*) window;
-  
-  while (private->window_type == GDK_WINDOW_CHILD)
-    {
-      window = ((GdkWindowPrivate*) window)->parent;
-      private = (GdkWindowPrivate*) window;
-    }
-  
-  return window;
+  return (GdkWindow *)window;
 }
 
 GList*
 gdk_window_get_children (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
   GdkWindow *child;
   GList *children;
   Window root;
@@ -1742,12 +1579,13 @@ gdk_window_get_children (GdkWindow *window)
   unsigned int i;
   
   g_return_val_if_fail (window != NULL, NULL);
-  
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
   
-  XQueryTree (private->xdisplay, private->xwindow,
+  XQueryTree (GDK_DRAWABLE_XDISPLAY (window),
+             GDK_DRAWABLE_XID (window),
              &root, &parent, &xchildren, &nchildren);
   
   children = NULL;
@@ -1771,83 +1609,82 @@ gdk_window_get_children (GdkWindow *window)
 GdkEventMask  
 gdk_window_get_events (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
   XWindowAttributes attrs;
   GdkEventMask event_mask;
   int i;
   
   g_return_val_if_fail (window != NULL, 0);
-  
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return 0;
-  
-  XGetWindowAttributes (gdk_display, private->xwindow, 
-                       &attrs);
-  
-  event_mask = 0;
-  for (i = 0; i < gdk_nevent_masks; i++)
+  else
     {
-      if (attrs.your_event_mask & gdk_event_mask_table[i])
-       event_mask |= 1 << (i + 1);
-    }
+      XGetWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                           GDK_DRAWABLE_XID (window), 
+                           &attrs);
+      
+      event_mask = 0;
+      for (i = 0; i < gdk_nevent_masks; i++)
+       {
+         if (attrs.your_event_mask & gdk_event_mask_table[i])
+           event_mask |= 1 << (i + 1);
+       }
   
-  return event_mask;
+      return event_mask;
+    }
 }
 
 void          
 gdk_window_set_events (GdkWindow       *window,
                       GdkEventMask     event_mask)
 {
-  GdkWindowPrivate *private;
   long xevent_mask;
   int i;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  xevent_mask = StructureNotifyMask;
-  for (i = 0; i < gdk_nevent_masks; i++)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      if (event_mask & (1 << (i + 1)))
-       xevent_mask |= gdk_event_mask_table[i];
+      xevent_mask = StructureNotifyMask;
+      for (i = 0; i < gdk_nevent_masks; i++)
+       {
+         if (event_mask & (1 << (i + 1)))
+           xevent_mask |= gdk_event_mask_table[i];
+       }
+      
+      XSelectInput (GDK_DRAWABLE_XDISPLAY (window),
+                   GDK_DRAWABLE_XID (window),
+                   xevent_mask);
     }
-  
-  XSelectInput (gdk_display, private->xwindow, 
-               xevent_mask);
 }
 
 void
 gdk_window_add_colormap_windows (GdkWindow *window)
 {
   GdkWindow *toplevel;
-  GdkWindowPrivate *toplevel_private;
-  GdkWindowPrivate *window_private;
   Window *old_windows;
   Window *new_windows;
   int i, count;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   toplevel = gdk_window_get_toplevel (window);
-  toplevel_private = (GdkWindowPrivate*) toplevel;
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (toplevel))
     return;
   
   old_windows = NULL;
-  if (!XGetWMColormapWindows (toplevel_private->xdisplay,
-                             toplevel_private->xwindow,
+  if (!XGetWMColormapWindows (GDK_DRAWABLE_XDISPLAY (toplevel),
+                             GDK_DRAWABLE_XID (toplevel),
                              &old_windows, &count))
     {
       count = 0;
     }
   
   for (i = 0; i < count; i++)
-    if (old_windows[i] == window_private->xwindow)
+    if (old_windows[i] == GDK_DRAWABLE_XID (window))
       {
        XFree (old_windows);
        return;
@@ -1857,10 +1694,10 @@ gdk_window_add_colormap_windows (GdkWindow *window)
   
   for (i = 0; i < count; i++)
     new_windows[i] = old_windows[i];
-  new_windows[count] = window_private->xwindow;
+  new_windows[count] = GDK_DRAWABLE_XID (window);
   
-  XSetWMColormapWindows (toplevel_private->xdisplay,
-                        toplevel_private->xwindow,
+  XSetWMColormapWindows (GDK_DRAWABLE_XDISPLAY (toplevel),
+                        GDK_DRAWABLE_XID (toplevel),
                         new_windows, count + 1);
   
   g_free (new_windows);
@@ -1896,24 +1733,20 @@ gdk_window_shape_combine_mask (GdkWindow *window,
                               GdkBitmap *mask,
                               gint x, gint y)
 {
-  GdkWindowPrivate *window_private;
   Pixmap pixmap;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
 #ifdef HAVE_SHAPE_EXT
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   if (gdk_window_have_shape_ext ())
     {
       if (mask)
        {
-         GdkWindowPrivate *pixmap_private;
-         
-         pixmap_private = (GdkWindowPrivate*) mask;
-         pixmap = (Pixmap) pixmap_private->xwindow;
+         pixmap = GDK_DRAWABLE_XID (mask);
        }
       else
        {
@@ -1922,8 +1755,8 @@ gdk_window_shape_combine_mask (GdkWindow *window,
          pixmap = None;
        }
       
-      XShapeCombineMask (window_private->xdisplay,
-                        window_private->xwindow,
+      XShapeCombineMask (GDK_DRAWABLE_XDISPLAY (window),
+                        GDK_DRAWABLE_XID (window),
                         ShapeBounding,
                         x, y,
                         pixmap,
@@ -1941,8 +1774,11 @@ gdk_window_add_filter (GdkWindow     *window,
   GList *tmp_list;
   GdkEventFilter *filter;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   private = (GdkWindowPrivate*) window;
-  if (private && private->destroyed)
+  if (private && GDK_DRAWABLE_DESTROYED (window))
     return;
   
   if (private)
@@ -1977,6 +1813,9 @@ gdk_window_remove_filter (GdkWindow     *window,
   GList *tmp_list, *node;
   GdkEventFilter *filter;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   private = (GdkWindowPrivate*) window;
   
   if (private)
@@ -2008,19 +1847,19 @@ void
 gdk_window_set_override_redirect (GdkWindow *window,
                                  gboolean override_redirect)
 {
-  GdkWindowPrivate *private;
   XSetWindowAttributes attr;
   
   g_return_if_fail (window != NULL);
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  attr.override_redirect = (override_redirect == FALSE)?False:True;
-  XChangeWindowAttributes (gdk_display,
-                          ((GdkWindowPrivate *)window)->xwindow,
-                          CWOverrideRedirect,
-                          &attr);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (GDK_DRAWABLE_DESTROYED (window))
+    {
+      attr.override_redirect = (override_redirect == FALSE)?False:True;
+      XChangeWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                              GDK_DRAWABLE_XID (window),
+                              CWOverrideRedirect,
+                              &attr);
+    }
 }
 
 void          
@@ -2030,40 +1869,38 @@ gdk_window_set_icon (GdkWindow *window,
                     GdkBitmap *mask)
 {
   XWMHints *wm_hints;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
 
-  wm_hints = XGetWMHints (window_private->xdisplay, window_private->xwindow);
+  wm_hints = XGetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window));
   if (!wm_hints)
     wm_hints = XAllocWMHints ();
 
   if (icon_window != NULL)
     {
-      private = (GdkWindowPrivate *)icon_window;
       wm_hints->flags |= IconWindowHint;
-      wm_hints->icon_window = private->xwindow;
+      wm_hints->icon_window = GDK_DRAWABLE_XID (icon_window);
     }
   
   if (pixmap != NULL)
     {
-      private = (GdkWindowPrivate *)pixmap;
       wm_hints->flags |= IconPixmapHint;
-      wm_hints->icon_pixmap = private->xwindow;
+      wm_hints->icon_pixmap = GDK_DRAWABLE_XID (pixmap);
     }
   
   if (mask != NULL)
     {
-      private = (GdkWindowPrivate *)mask;
       wm_hints->flags |= IconMaskHint;
-      wm_hints->icon_mask = private->xwindow;
+      wm_hints->icon_mask = GDK_DRAWABLE_XID (mask);
     }
 
-  XSetWMHints (window_private->xdisplay, window_private->xwindow, wm_hints);
+  XSetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+              GDK_DRAWABLE_XID (window), wm_hints);
   XFree (wm_hints);
 }
 
@@ -2071,15 +1908,16 @@ void
 gdk_window_set_icon_name (GdkWindow *window, 
                          gchar *    name)
 {
-  GdkWindowPrivate *window_private;
   XTextProperty property;
   gint res;
   
   g_return_if_fail (window != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
-  res = XmbTextListToTextProperty (window_private->xdisplay,
+  
+  res = XmbTextListToTextProperty (GDK_DRAWABLE_XDISPLAY (window),
                                   &name, 1, XStdICCTextStyle,
                                           &property);
   if (res < 0)
@@ -2088,7 +1926,8 @@ gdk_window_set_icon_name (GdkWindow *window,
       return;
     }
   
-  XSetWMIconName (window_private->xdisplay, window_private->xwindow,
+  XSetWMIconName (GDK_DRAWABLE_XDISPLAY (window),
+                 GDK_DRAWABLE_XID (window),
                  &property);
   
   if (property.value)
@@ -2100,25 +1939,25 @@ gdk_window_set_group (GdkWindow *window,
                      GdkWindow *leader)
 {
   XWMHints *wm_hints;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   g_return_if_fail (leader != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  g_return_if_fail (GDK_IS_WINDOW (leader));
+
+  if (GDK_DRAWABLE_DESTROYED (window) || GDK_DRAWABLE_DESTROYED (leader))
     return;
   
-  private = (GdkWindowPrivate *)leader;
-
-  wm_hints = XGetWMHints (window_private->xdisplay, window_private->xwindow);
+  wm_hints = XGetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window));
   if (!wm_hints)
     wm_hints = XAllocWMHints ();
 
   wm_hints->flags |= WindowGroupHint;
-  wm_hints->window_group = private->xwindow;
+  wm_hints->window_group = GDK_DRAWABLE_XID (leader);
 
-  XSetWMHints (window_private->xdisplay, window_private->xwindow, wm_hints);
+  XSetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+              GDK_DRAWABLE_XID (window), wm_hints);
   XFree (wm_hints);
 }
 
@@ -2133,18 +1972,14 @@ gdk_window_set_mwm_hints (GdkWindow *window,
   gulong nitems;
   gulong bytes_after;
   
-  GdkWindowPrivate *window_private;
-  
-  g_return_if_fail (window != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   if (!hints_atom)
-    hints_atom = XInternAtom (window_private->xdisplay
+    hints_atom = XInternAtom (GDK_DRAWABLE_XDISPLAY (window)
                              _XA_MOTIF_WM_HINTS, FALSE);
   
-  XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
+  XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                      hints_atom, 0, sizeof (MotifWmHints)/sizeof (long),
                      False, AnyPropertyType, &type, &format, &nitems,
                      &bytes_after, (guchar **)&hints);
@@ -2165,7 +2000,7 @@ gdk_window_set_mwm_hints (GdkWindow *window,
        }
     }
   
-  XChangeProperty (window_private->xdisplay, window_private->xwindow,
+  XChangeProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                   hints_atom, hints_atom, 32, PropModeReplace,
                   (guchar *)hints, sizeof (MotifWmHints)/sizeof (long));
   
@@ -2179,6 +2014,9 @@ gdk_window_set_decorations (GdkWindow      *window,
 {
   MotifWmHints hints;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  
   hints.flags = MWM_HINTS_DECORATIONS;
   hints.decorations = decorations;
   
@@ -2191,6 +2029,9 @@ gdk_window_set_functions (GdkWindow    *window,
 {
   MotifWmHints hints;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  
   hints.flags = MWM_HINTS_FUNCTIONS;
   hints.functions = functions;
   
@@ -2529,34 +2370,28 @@ gdk_propagate_shapes (Display *disp,
 void
 gdk_window_set_child_shapes (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
 #ifdef HAVE_SHAPE_EXT
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  if (gdk_window_have_shape_ext ())
-    gdk_propagate_shapes (private->xdisplay, private->xwindow, FALSE);
+  if (!GDK_DRAWABLE_DESTROYED (window) &&
+      gdk_window_have_shape_ext ())
+    gdk_propagate_shapes (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window), FALSE);
 #endif   
 }
 
 void
 gdk_window_merge_child_shapes (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
 #ifdef HAVE_SHAPE_EXT
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  if (gdk_window_have_shape_ext ())
-    gdk_propagate_shapes (private->xdisplay, private->xwindow, TRUE);
+  if (!GDK_DRAWABLE_DESTROYED (window) &&
+      gdk_window_have_shape_ext ())
+    gdk_propagate_shapes (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window), TRUE);
 #endif   
 }
 
@@ -2575,6 +2410,7 @@ gdk_window_is_visible (GdkWindow *window)
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   
   g_return_val_if_fail (window != NULL, FALSE);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
   
   return private->mapped;
 }
@@ -2597,10 +2433,11 @@ gdk_window_is_viewable (GdkWindow *window)
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   
   g_return_val_if_fail (window != NULL, FALSE);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
   
   while (private && 
         (private != &gdk_root_parent) &&
-        (private->window_type != GDK_WINDOW_FOREIGN))
+        (private->drawable.window_type != GDK_WINDOW_FOREIGN))
     {
       if (!private->mapped)
        return FALSE;
@@ -2611,16 +2448,6 @@ gdk_window_is_viewable (GdkWindow *window)
   return TRUE;
 }
 
-void          
-gdk_drawable_set_data (GdkDrawable   *drawable,
-                      const gchar   *key,
-                      gpointer       data,
-                      GDestroyNotify destroy_func)
-{
-  g_dataset_set_data_full (drawable, key, data, destroy_func);
-}
-
-
 /* Support for windows that can be guffaw-scrolled
  * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
  */
@@ -2685,29 +2512,27 @@ gdk_window_gravity_works (void)
 static void
 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   XSetWindowAttributes xattributes;
   
   g_return_if_fail (window != NULL);
   
   xattributes.bit_gravity = on ? StaticGravity : ForgetGravity;
-  XChangeWindowAttributes (private->xdisplay,
-                          private->xwindow,
+  XChangeWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                          GDK_DRAWABLE_XID (window),
                           CWBitGravity,  &xattributes);
 }
 
 static void
 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   XSetWindowAttributes xattributes;
   
   g_return_if_fail (window != NULL);
   
   xattributes.win_gravity = on ? StaticGravity : NorthWestGravity;
   
-  XChangeWindowAttributes (private->xdisplay,
-                          private->xwindow,
+  XChangeWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                          GDK_DRAWABLE_XID (window),
                           CWWinGravity,  &xattributes);
 }
 
@@ -2731,7 +2556,8 @@ gdk_window_set_static_gravities (GdkWindow *window,
   GList *tmp_list;
   
   g_return_val_if_fail (window != NULL, FALSE);
-  
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
+
   if (!use_static == !private->guffaw_gravity)
     return TRUE;
   
@@ -2740,14 +2566,17 @@ gdk_window_set_static_gravities (GdkWindow *window,
   
   private->guffaw_gravity = use_static;
   
-  gdk_window_set_static_bit_gravity (window, use_static);
-  
-  tmp_list = private->children;
-  while (tmp_list)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      gdk_window_set_static_win_gravity (window, use_static);
+      gdk_window_set_static_bit_gravity (window, use_static);
       
-      tmp_list = tmp_list->next;
+      tmp_list = private->children;
+      while (tmp_list)
+       {
+         gdk_window_set_static_win_gravity (window, use_static);
+         
+         tmp_list = tmp_list->next;
+       }
     }
   
   return TRUE;
index 47f744497394132f7493acdabc25d60355d8ad80..263ad2bb0678355d0e8dfb1e7c456b2ecd707c74 100644 (file)
@@ -95,7 +95,7 @@ struct _GdkWindowAttr
   GdkWindowClass wclass;
   GdkVisual *visual;
   GdkColormap *colormap;
-  GdkWindowType window_type;
+  GdkDrawableType window_type;
   GdkCursor *cursor;
   gchar *wmclass_name;
   gchar *wmclass_class;
@@ -157,15 +157,6 @@ void             gdk_window_clear_area_e(GdkWindow    *window,
                                      gint          y,
                                      gint          width,
                                      gint          height);
-void         gdk_window_copy_area   (GdkWindow    *window,
-                                     GdkGC        *gc,
-                                     gint          x,
-                                     gint          y,
-                                     GdkWindow    *source_window,
-                                     gint          source_x,
-                                     gint          source_y,
-                                     gint          width,
-                                     gint          height);
 void         gdk_window_raise       (GdkWindow    *window);
 void         gdk_window_lower       (GdkWindow    *window);
 
@@ -253,8 +244,6 @@ void              gdk_window_set_back_pixmap (GdkWindow       *window,
                                          gint             parent_relative);
 void         gdk_window_set_cursor      (GdkWindow       *window,
                                          GdkCursor       *cursor);
-void         gdk_window_set_colormap    (GdkWindow       *window,
-                                         GdkColormap     *colormap);
 void         gdk_window_get_user_data   (GdkWindow       *window,
                                          gpointer        *data);
 void         gdk_window_get_geometry    (GdkWindow       *window,
@@ -269,9 +258,6 @@ void              gdk_window_get_position    (GdkWindow       *window,
 void         gdk_window_get_size        (GdkWindow       *window,
                                          gint            *width,
                                          gint            *height);
-GdkVisual*    gdk_window_get_visual     (GdkWindow       *window);
-GdkColormap*  gdk_window_get_colormap   (GdkWindow       *window);
-GdkWindowType gdk_window_get_type       (GdkWindow       *window);
 gint         gdk_window_get_origin      (GdkWindow       *window,
                                          gint            *x,
                                          gint            *y);
@@ -308,11 +294,6 @@ GList *       gdk_window_get_toplevels   (void);
 
 void          gdk_window_register_dnd    (GdkWindow       *window);
 
-void          gdk_drawable_set_data      (GdkDrawable     *drawable,
-                                         const gchar     *key,
-                                         gpointer         data,
-                                         GDestroyNotify   destroy_func);
-
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 995c9dca97bae332058be9df234a3d1ef241a70b..4f142bd1ef30cf03ffba4ef276f72aa2d0898a49 100644 (file)
 #define GDK_ROOT_WINDOW()             gdk_root_window
 #define GDK_ROOT_PARENT()             ((GdkWindow *)&gdk_root_parent)
 #define GDK_DISPLAY()                 gdk_display
-#define GDK_WINDOW_XDISPLAY(win)      (((GdkWindowPrivate*) win)->xdisplay)
-#define GDK_WINDOW_XWINDOW(win)       (((GdkWindowPrivate*) win)->xwindow)
+#define GDK_DRAWABLE_XDISPLAY(win)    (((GdkDrawablePrivate*) win)->xdisplay)
+#define GDK_DRAWABLE_XID(win)         (((GdkDrawablePrivate*) win)->xwindow)
+#define GDK_WINDOW_XDISPLAY           GDK_DRAWABLE_XDISPLAY
+#define GDK_WINDOW_XWINDOW            GDK_DRAWABLE_XID
 #define GDK_IMAGE_XDISPLAY(image)     (((GdkImagePrivate*) image)->xdisplay)
 #define GDK_IMAGE_XIMAGE(image)       (((GdkImagePrivate*) image)->ximage)
 #define GDK_GC_XDISPLAY(gc)           (((GdkGCPrivate*) gc)->xdisplay)
index 6431c780ad95fbd8cab96be2b2ca2118b23e417f..04260a2cde91fa0c40395b06d1dfd7eeb8dc0fdc 100644 (file)
@@ -27,6 +27,7 @@
 #include <X11/Xlib.h>
 #include <X11/cursorfont.h>
 
+#include "gdkx.h"
 #include "gdkcursor.h"
 #include "gdkprivate.h"
 
@@ -57,8 +58,8 @@ gdk_cursor_new_from_pixmap (GdkPixmap *source, GdkPixmap *mask, GdkColor *fg, Gd
   Cursor xcursor;
   XColor xfg, xbg;
   
-  source_pixmap = ((GdkPixmapPrivate *) source)->xwindow;
-  mask_pixmap   = ((GdkPixmapPrivate *) mask)->xwindow;
+  source_pixmap = GDK_DRAWABLE_XID (source);
+  mask_pixmap   = GDK_DRAWABLE_XID (mask);
 
   xfg.pixel = fg->pixel;
   xfg.red = fg->red;
index 37882292455a4ee2c4d4a0bb876d9d5a5174efd3..a58da225b1938921b2c991820e22b69f01e559dd 100644 (file)
@@ -2416,9 +2416,8 @@ xdnd_manage_source_filter (GdkDragContext *context,
                           gboolean        add_filter)
 {
   gint old_warnings = 0;       /* quiet gcc */
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
                               
-  gboolean is_foreign = (private->window_type == GDK_WINDOW_FOREIGN);
+  gboolean is_foreign = GDK_DRAWABLE_TYPE (window);
 
   if (is_foreign)
     {
@@ -2426,7 +2425,7 @@ xdnd_manage_source_filter (GdkDragContext *context,
       gdk_error_warnings = 0;
     }
 
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       if (add_filter)
        {
index 2adc09cb45800c0587965ef850ae378095b2b71e..1738a0dbbeb29f209dc9543372a13d6737e64ff7 100644 (file)
@@ -286,11 +286,7 @@ graphics_expose_predicate (Display  *display,
                           XEvent   *xevent,
                           XPointer  arg)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate*) arg;
-  
-  g_return_val_if_fail (private != NULL, False);
-  
-  if (xevent->xany.window == private->xwindow &&
+  if (xevent->xany.window == GDK_DRAWABLE_XID (arg) &&
       (xevent->xany.type == GraphicsExpose ||
        xevent->xany.type == NoExpose))
     return True;
@@ -1009,6 +1005,8 @@ gdk_event_translate (GdkEvent *event,
     }
   
   window = gdk_window_lookup (xevent->xany.window);
+  /* FIXME: window might be a GdkPixmap!!! */
+  
   window_private = (GdkWindowPrivate *) window;
   
   if (window != NULL)
@@ -1017,7 +1015,7 @@ gdk_event_translate (GdkEvent *event,
   event->any.window = window;
   event->any.send_event = xevent->xany.send_event ? TRUE : FALSE;
   
-  if (window_private && window_private->destroyed)
+  if (window_private && GDK_DRAWABLE_DESTROYED (window))
     {
       if (xevent->type != DestroyNotify)
        return FALSE;
@@ -1040,7 +1038,7 @@ gdk_event_translate (GdkEvent *event,
 
 #ifdef USE_XIM
   if (window == NULL && gdk_xim_window && xevent->type == KeyPress &&
-      !((GdkWindowPrivate *) gdk_xim_window)->destroyed)
+      !GDK_DRAWABLE_DESTROYED (gdk_xim_window))
     {
       /*
        * If user presses a key in Preedit or Status window, keypress event
@@ -1340,7 +1338,7 @@ gdk_event_translate (GdkEvent *event,
       
       /* Tell XInput stuff about it if appropriate */
       if (window_private &&
-         !window_private->destroyed &&
+         !GDK_DRAWABLE_DESTROYED (window) &&
          (window_private->extension_events != 0) &&
          gdk_input_vtable.enter_event)
        gdk_input_vtable.enter_event (&xevent->xcrossing, window);
@@ -1635,9 +1633,9 @@ gdk_event_translate (GdkEvent *event,
       event->any.type = GDK_DESTROY;
       event->any.window = window;
       
-      return_val = window_private && !window_private->destroyed;
+      return_val = window_private && !GDK_DRAWABLE_DESTROYED (window);
       
-      if (window && window_private->xwindow != GDK_ROOT_WINDOW())
+      if (window && GDK_DRAWABLE_XID (window) != GDK_ROOT_WINDOW())
        gdk_window_destroy_notify (window);
       break;
       
@@ -1698,16 +1696,16 @@ gdk_event_translate (GdkEvent *event,
                           xevent->xconfigure.override_redirect,
                           !window
                           ? " (discarding)"
-                          : window_private->window_type == GDK_WINDOW_CHILD
+                          : GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_CHILD
                           ? " (discarding child)"
                           : ""));
       if (window &&
-         !window_private->destroyed &&
+         !GDK_DRAWABLE_DESTROYED (window) &&
          (window_private->extension_events != 0) &&
          gdk_input_vtable.configure_event)
        gdk_input_vtable.configure_event (&xevent->xconfigure, window);
 
-      if (!window || window_private->window_type == GDK_WINDOW_CHILD)
+      if (!window || GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_CHILD)
        return_val = FALSE;
       else
        {
@@ -1718,15 +1716,15 @@ gdk_event_translate (GdkEvent *event,
          
          if (!xevent->xconfigure.x &&
              !xevent->xconfigure.y &&
-             !window_private->destroyed)
+             !GDK_DRAWABLE_DESTROYED (window))
            {
              gint tx = 0;
              gint ty = 0;
              Window child_window = 0;
 
              gdk_error_trap_push ();
-             if (XTranslateCoordinates (window_private->xdisplay,
-                                        window_private->xwindow,
+             if (XTranslateCoordinates (GDK_DRAWABLE_XDISPLAY (window),
+                                        GDK_DRAWABLE_XID (window),
                                         gdk_root_window,
                                         0, 0,
                                         &tx, &ty,
@@ -1748,8 +1746,8 @@ gdk_event_translate (GdkEvent *event,
            }
          window_private->x = event->configure.x;
          window_private->y = event->configure.y;
-         window_private->width = xevent->xconfigure.width;
-         window_private->height = xevent->xconfigure.height;
+         window_private->drawable.width = xevent->xconfigure.width;
+         window_private->drawable.height = xevent->xconfigure.height;
          if (window_private->resize_count > 1)
            window_private->resize_count -= 1;
        }
@@ -1891,7 +1889,7 @@ gdk_event_translate (GdkEvent *event,
       /* something else - (e.g., a Xinput event) */
       
       if (window_private &&
-         !window_private->destroyed &&
+         !window_private->drawable.destroyed &&
          (window_private->extension_events != 0) &&
          gdk_input_vtable.other_event)
        return_val = gdk_input_vtable.other_event(event, xevent, window);
index 020460f329658076412ba878290d8cae5a7778d3..a13d1a6124388a676885f32c9cbfd62da7efb458 100644 (file)
@@ -625,7 +625,7 @@ gdk_ic_new (GdkICAttr *attr, GdkICAttributesType mask)
     }
 
   if (attr->client_window == NULL ||
-      ((GdkWindowPrivate *)attr->client_window)->destroyed)
+      GDK_DRAWABLE_DESTROYED (attr->client_window))
     {
       g_warning ("Client_window is null or already destroyed.\n");
       return NULL;
@@ -1084,7 +1084,7 @@ gdk_ic_set_attr (GdkIC *ic,
   if (mask & GDK_IC_PREEDIT_PIXMAP)
     {
       if (attr->preedit_pixmap != NULL &&
-         ((GdkPixmapPrivate *)attr->preedit_pixmap)->destroyed)
+         GDK_DRAWABLE_DESTROYED (attr->preedit_pixmap))
        {
          g_warning ("Preedit pixmap is already destroyed.\n");
          error |= GDK_IC_PREEDIT_PIXMAP;
@@ -1171,7 +1171,7 @@ gdk_ic_set_attr (GdkIC *ic,
   if (mask & GDK_IC_STATUS_PIXMAP)
     {
       if (attr->status_pixmap != NULL &&
-         ((GdkPixmapPrivate *)attr->status_pixmap)->destroyed)
+         GDK_DRAWABLE_DESTROYED (attr->status_pixmap))
        {
          g_warning ("Preedit pixmap is already destroyed.\n");
          error |= GDK_IC_STATUS_PIXMAP;
index 769727a4b63ea5c40c1988aadd7a46455590b392..4facec7e75042273946b37f41bfb9fe97a5fd895 100644 (file)
@@ -56,6 +56,7 @@
 #include "gdk.h"               /* For gdk_error_trap_* / gdk_flush_* */
 #include "gdkimage.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 
 
 static void gdk_image_put_normal (GdkDrawable *drawable,
@@ -331,12 +332,10 @@ gdk_image_get (GdkWindow *window,
 {
   GdkImage *image;
   GdkImagePrivate *private;
-  GdkWindowPrivate *win_private;
 
   g_return_val_if_fail (window != NULL, NULL);
 
-  win_private = (GdkWindowPrivate *) window;
-  if (win_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   private = g_new (GdkImagePrivate, 1);
@@ -345,7 +344,7 @@ gdk_image_get (GdkWindow *window,
   private->xdisplay = gdk_display;
   private->image_put = gdk_image_put_normal;
   private->ximage = XGetImage (private->xdisplay,
-                              win_private->xwindow,
+                              GDK_DRAWABLE_XID (window),
                               x, y, width, height,
                               AllPlanes, ZPixmap);
 
@@ -455,7 +454,6 @@ gdk_image_put_normal (GdkDrawable *drawable,
                      gint         width,
                      gint         height)
 {
-  GdkWindowPrivate *drawable_private;
   GdkImagePrivate *image_private;
   GdkGCPrivate *gc_private;
 
@@ -463,15 +461,14 @@ gdk_image_put_normal (GdkDrawable *drawable,
   g_return_if_fail (image != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   image_private = (GdkImagePrivate*) image;
   gc_private = (GdkGCPrivate*) gc;
 
   g_return_if_fail (image->type == GDK_IMAGE_NORMAL);
 
-  XPutImage (drawable_private->xdisplay, drawable_private->xwindow,
+  XPutImage (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), 
             gc_private->xgc, image_private->ximage,
             xsrc, ysrc, xdest, ydest, width, height);
 }
@@ -488,7 +485,6 @@ gdk_image_put_shared (GdkDrawable *drawable,
                      gint         height)
 {
 #ifdef USE_SHM
-  GdkWindowPrivate *drawable_private;
   GdkImagePrivate *image_private;
   GdkGCPrivate *gc_private;
 
@@ -496,15 +492,14 @@ gdk_image_put_shared (GdkDrawable *drawable,
   g_return_if_fail (image != NULL);
   g_return_if_fail (gc != NULL);
 
-  drawable_private = (GdkWindowPrivate*) drawable;
-  if (drawable_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (drawable))
     return;
   image_private = (GdkImagePrivate*) image;
   gc_private = (GdkGCPrivate*) gc;
 
   g_return_if_fail (image->type == GDK_IMAGE_SHARED);
 
-  XShmPutImage (drawable_private->xdisplay, drawable_private->xwindow,
+  XShmPutImage (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), 
                gc_private->xgc, image_private->ximage,
                xsrc, ysrc, xdest, ydest, width, height, False);
 #else /* USE_SHM */
index edfc4ebd83ecdadb2acbda9effd2b9d943f3c226..d9bb835b8919c0db66ce7f92eb73d96f80348cc8 100644 (file)
@@ -472,14 +472,14 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
                                 gdouble *x, gdouble *y, gdouble *pressure,
                                 gdouble *xtilt, gdouble *ytilt)
 {
-  GdkWindowPrivate *win_priv;
+  GdkDrawablePrivate *drawable_priv;
 
   int x_axis, y_axis, pressure_axis, xtilt_axis, ytilt_axis;
 
   double device_width, device_height;
   double x_offset, y_offset, x_scale, y_scale;
 
-  win_priv = (GdkWindowPrivate *) input_window->window;
+  drawable_priv = (GdkDrawablePrivate *) input_window->window;
 
   x_axis = gdkdev->axis_for_use[GDK_AXIS_X];
   y_axis = gdkdev->axis_for_use[GDK_AXIS_Y];
@@ -505,26 +505,26 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
       double device_aspect = (device_height*gdkdev->axes[y_axis].resolution) /
        (device_width*gdkdev->axes[x_axis].resolution);
 
-      if (device_aspect * win_priv->width >= win_priv->height)
+      if (device_aspect * drawable_priv->width >= drawable_priv->height)
        {
          /* device taller than window */
-         x_scale = win_priv->width / device_width;
+         x_scale = drawable_priv->width / device_width;
          y_scale = (x_scale * gdkdev->axes[x_axis].resolution)
            / gdkdev->axes[y_axis].resolution;
 
          x_offset = 0;
          y_offset = -(device_height * y_scale - 
-                              win_priv->height)/2;
+                              drawable_priv->height)/2;
        }
       else
        {
          /* window taller than device */
-         y_scale = win_priv->height / device_height;
+         y_scale = drawable_priv->height / device_height;
          x_scale = (y_scale * gdkdev->axes[y_axis].resolution)
            / gdkdev->axes[x_axis].resolution;
 
          y_offset = 0;
-         x_offset = - (device_width * x_scale - win_priv->width)/2;
+         x_offset = - (device_width * x_scale - drawable_priv->width)/2;
        }
     }
   
index 874a6cafe09fa4f966a1a32d2bb30ff2c647871a..334c3d46d82930d2d7bac7ad3d0cf5cc446458da 100644 (file)
@@ -127,20 +127,20 @@ gdk_input_motion_events (GdkWindow *window,
                         guint32 stop,
                         gint *nevents_return)
 {
-  GdkWindowPrivate *window_private;
   XTimeCoord *xcoords;
   GdkTimeCoord *coords;
   int i;
 
   g_return_val_if_fail (window != NULL, NULL);
-  window_private = (GdkWindowPrivate *) window;
-  if (window_private->destroyed)
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+  
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   if (deviceid == GDK_CORE_POINTER)
     {
-      xcoords = XGetMotionEvents (gdk_display,
-                                 window_private->xwindow,
+      xcoords = XGetMotionEvents (GDK_DRAWABLE_XDISPLAY (window),
+                                 GDK_DRAWABLE_XID (window),
                                  start, stop, nevents_return);
       if (xcoords)
        {
@@ -224,8 +224,10 @@ gdk_input_set_extension_events (GdkWindow *window, gint mask,
   GdkInputWindow *iw;
 
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
 
   if (mode == GDK_EXTENSION_EVENTS_NONE)
index 96e342f62c0b06a9c4b944251ecefe60c1d3dbb6..87b15b6a91c2c5b2081f169134f7f9999458cf43 100644 (file)
@@ -47,6 +47,7 @@
 
 #include "gdk.h"
 
+#include "gdkx.h"
 #include "gdkprivate.h"
 #include "gdkinputprivate.h"
 
@@ -493,10 +494,7 @@ gdk_pointer_grab (GdkWindow *        window,
                  GdkCursor *     cursor,
                  guint32         time)
 {
-  /*  From gdkwindow.c */
   gint return_val;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *confine_to_private;
   GdkCursorPrivate *cursor_private;
   guint xevent_mask;
   Window xwindow;
@@ -505,17 +503,17 @@ gdk_pointer_grab (GdkWindow *       window,
   int i;
   
   g_return_val_if_fail (window != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
+  g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
   
-  window_private = (GdkWindowPrivate*) window;
-  confine_to_private = (GdkWindowPrivate*) confine_to;
   cursor_private = (GdkCursorPrivate*) cursor;
   
-  xwindow = window_private->xwindow;
+  xwindow = GDK_DRAWABLE_XID (window);
   
-  if (!confine_to || confine_to_private->destroyed)
+  if (!confine_to || GDK_DRAWABLE_DESTROYED (confine_to))
     xconfine_to = None;
   else
-    xconfine_to = confine_to_private->xwindow;
+    xconfine_to = GDK_DRAWABLE_XID (confine_to);
   
   if (!cursor)
     xcursor = None;
@@ -541,8 +539,8 @@ gdk_pointer_grab (GdkWindow *         window,
   
   if (return_val == Success)
     {
-      if (!window_private->destroyed)
-       return_val = XGrabPointer (window_private->xdisplay,
+      if (!GDK_DRAWABLE_DESTROYED (window))
+       return_val = XGrabPointer (GDK_DRAWABLE_XDISPLAY (window),
                                   xwindow,
                                   owner_events,
                                   xevent_mask,
@@ -555,7 +553,7 @@ gdk_pointer_grab (GdkWindow *         window,
     }
   
   if (return_val == GrabSuccess)
-    gdk_xgrab_window = window_private;
+    gdk_xgrab_window = (GdkWindowPrivate *)window;
   
   return return_val;
 }
@@ -631,17 +629,12 @@ gdk_keyboard_grab (GdkWindow *       window,
                   gint            owner_events,
                   guint32         time)
 {
-  GdkWindowPrivate *window_private;
-  Window xwindow;
-  
   g_return_val_if_fail (window != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
   
-  window_private = (GdkWindowPrivate*) window;
-  xwindow = window_private->xwindow;
-  
-  if (!window_private->destroyed)
-    return XGrabKeyboard (window_private->xdisplay,
-                         xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    return XGrabKeyboard (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window),
                          owner_events,
                          GrabModeAsync, GrabModeAsync,
                          time);
index 5656b18a93fc0fb1e9d05f9b4f8f9d2099527702..8ee69db9cd1ab5c706fa3171d62581ce8cd11c23 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "gdkpixmap.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 
 typedef struct
 {
@@ -56,36 +57,32 @@ gdk_pixmap_new (GdkWindow *window,
                gint       depth)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *private;
-  GdkWindowPrivate *window_private;
+  GdkDrawablePrivate *private;
 
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);
   g_return_val_if_fail ((width != 0) && (height != 0), NULL);
 
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   if (depth == -1)
-    depth = gdk_window_get_visual (window)->depth;
+    depth = gdk_drawable_get_visual (window)->depth;
 
-  private = g_new0 (GdkWindowPrivate, 1);
+  private = g_new0 (GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap*) private;
 
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
-  private->xwindow = XCreatePixmap (private->xdisplay, window_private->xwindow,
+  private->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+  private->window_type = GDK_DRAWABLE_PIXMAP;
+  private->xwindow = XCreatePixmap (private->xdisplay,
+                                   GDK_DRAWABLE_XID (window),
                                    width, height, depth);
   private->colormap = NULL;
-  private->parent = NULL;
-  private->x = 0;
-  private->y = 0;
   private->width = width;
   private->height = height;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = 0;
 
@@ -101,35 +98,30 @@ gdk_bitmap_create_from_data (GdkWindow   *window,
                             gint         height)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *private;
-  GdkWindowPrivate *window_private;
+  GdkDrawablePrivate *private;
 
   g_return_val_if_fail (data != NULL, NULL);
   g_return_val_if_fail ((width != 0) && (height != 0), NULL);
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
 
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
-  private = g_new0 (GdkWindowPrivate, 1);
+  private = g_new0 (GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap*) private;
 
-  private->parent = NULL;
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
-  private->x = 0;
-  private->y = 0;
+  private->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+  private->window_type = GDK_DRAWABLE_PIXMAP;
   private->width = width;
   private->height = height;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = FALSE;
 
   private->xwindow = XCreateBitmapFromData (private->xdisplay,
-                                           window_private->xwindow,
+                                           GDK_DRAWABLE_XID (window),
                                            (char *)data, width, height);
 
   gdk_xid_table_insert (&private->xwindow, pixmap);
@@ -147,9 +139,9 @@ gdk_pixmap_create_from_data (GdkWindow   *window,
                             GdkColor    *bg)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *private;
-  GdkWindowPrivate *window_private;
+  GdkDrawablePrivate *private;
 
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   g_return_val_if_fail (data != NULL, NULL);
   g_return_val_if_fail (fg != NULL, NULL);
   g_return_val_if_fail (bg != NULL, NULL);
@@ -159,29 +151,24 @@ gdk_pixmap_create_from_data (GdkWindow   *window,
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   if (depth == -1)
-    depth = gdk_window_get_visual (window)->depth;
+    depth = gdk_drawable_get_visual (window)->depth;
 
-  private = g_new0 (GdkWindowPrivate, 1);
+  private = g_new0 (GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap*) private;
 
-  private->parent = NULL;
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
-  private->x = 0;
-  private->y = 0;
+  private->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+  private->window_type = GDK_DRAWABLE_PIXMAP;
   private->width = width;
   private->height = height;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = FALSE;
 
   private->xwindow = XCreatePixmapFromBitmapData (private->xdisplay,
-                                                 window_private->xwindow,
+                                                 GDK_DRAWABLE_XID (window),
                                                  (char *)data, width, height,
                                                  fg->pixel, bg->pixel, depth);
 
@@ -460,8 +447,8 @@ _gdk_pixmap_create_from_xpm (GdkWindow  *window,
   
   if (colormap == NULL)
     {
-      colormap = gdk_window_get_colormap (window);
-      visual = gdk_window_get_visual (window);
+      colormap = gdk_drawable_get_colormap (window);
+      visual = gdk_drawable_get_visual (window);
     }
   else
     visual = ((GdkColormapPrivate *)colormap)->visual;
@@ -760,8 +747,7 @@ GdkPixmap*
 gdk_pixmap_foreign_new (guint32 anid)
 {
   GdkPixmap *pixmap;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *private;
+  GdkDrawablePrivate *private;
   Pixmap xpixmap;
   Window root_return;
   unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret;
@@ -772,29 +758,24 @@ gdk_pixmap_foreign_new (guint32 anid)
   
   /* set the pixmap to the passed in value */
   xpixmap = anid;
-  /* get the root window */
-  window_private = &gdk_root_parent;
 
   /* get information about the Pixmap to fill in the structure for
      the gdk window */
-  if (!XGetGeometry(window_private->xdisplay, xpixmap, &root_return,
+  if (!XGetGeometry(GDK_DISPLAY(),
+                   xpixmap, &root_return,
                    &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
       return NULL;
       
   /* allocate a new gdk pixmap */
-  private = g_new(GdkWindowPrivate, 1);
+  private = g_new(GdkDrawablePrivate, 1);
   pixmap = (GdkPixmap *)private;
 
-  private->xdisplay = window_private->xdisplay;
-  private->window_type = GDK_WINDOW_PIXMAP;
+  private->xdisplay = GDK_DISPLAY();
+  private->window_type = GDK_DRAWABLE_PIXMAP;
   private->xwindow = xpixmap;
   private->colormap = NULL;
-  private->parent = NULL;
-  private->x = 0;
-  private->y = 0;
   private->width = w_ret;
   private->height = h_ret;
-  private->resize_count = 0;
   private->ref_count = 1;
   private->destroyed = 0;
   
@@ -806,8 +787,9 @@ gdk_pixmap_foreign_new (guint32 anid)
 GdkPixmap*
 gdk_pixmap_ref (GdkPixmap *pixmap)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
+  GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap;
   g_return_val_if_fail (pixmap != NULL, NULL);
+  g_return_val_if_fail (GDK_IS_PIXMAP (private), NULL);
 
   private->ref_count += 1;
   return pixmap;
@@ -816,8 +798,9 @@ gdk_pixmap_ref (GdkPixmap *pixmap)
 void
 gdk_pixmap_unref (GdkPixmap *pixmap)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
+  GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap;
   g_return_if_fail (pixmap != NULL);
+  g_return_if_fail (GDK_IS_PIXMAP (private));
   g_return_if_fail (private->ref_count > 0);
 
   private->ref_count -= 1;
index 5a17abd769396c850c006b3883d124a76bef139b..b91b787d1bb9c9c4252118a8fa493fe2a7123470 100644 (file)
@@ -28,6 +28,7 @@
 #include <X11/Xatom.h>
 #include <string.h>
 
+#include "gdkx.h"
 #include "gdkproperty.h"
 #include "gdkprivate.h"
 
@@ -111,14 +112,11 @@ gdk_property_get (GdkWindow   *window,
 
   if (window)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) window;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (window))
        return FALSE;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_WINDOW_XDISPLAY (window);
+      xwindow = GDK_WINDOW_XWINDOW (window);
     }
   else
     {
@@ -200,14 +198,11 @@ gdk_property_change (GdkWindow   *window,
 
   if (window)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) window;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (window))
        return;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_WINDOW_XDISPLAY (window);
+      xwindow = GDK_WINDOW_XWINDOW (window);
     }
   else
     {
@@ -228,14 +223,11 @@ gdk_property_delete (GdkWindow *window,
 
   if (window)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) window;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (window))
        return;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_WINDOW_XDISPLAY (window);
+      xwindow = GDK_WINDOW_XWINDOW (window);
     }
   else
     {
index ebffc3579caac8dc066ac802513734e35437a57b..e1272f4213a904709905289f862a5edb9a7db9dc 100644 (file)
@@ -45,14 +45,11 @@ gdk_selection_owner_set (GdkWindow *owner,
 
   if (owner)
     {
-      GdkWindowPrivate *private;
-
-      private = (GdkWindowPrivate*) owner;
-      if (private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (owner))
        return FALSE;
 
-      xdisplay = private->xdisplay;
-      xwindow = private->xwindow;
+      xdisplay = GDK_DRAWABLE_XDISPLAY (owner);
+      xwindow = GDK_DRAWABLE_XID (owner);
     }
   else
     {
@@ -83,16 +80,11 @@ gdk_selection_convert (GdkWindow *requestor,
                       GdkAtom    target,
                       guint32    time)
 {
-  GdkWindowPrivate *private;
-
-  g_return_if_fail (requestor != NULL);
-
-  private = (GdkWindowPrivate*) requestor;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (requestor))
     return;
 
-  XConvertSelection (private->xdisplay, selection, target,
-                    gdk_selection_property, private->xwindow, time);
+  XConvertSelection (GDK_DRAWABLE_XDISPLAY (requestor), selection, target,
+                    gdk_selection_property, GDK_DRAWABLE_XID (requestor), time);
 }
 
 gint
@@ -101,7 +93,6 @@ gdk_selection_property_get (GdkWindow  *requestor,
                            GdkAtom    *ret_type,
                            gint       *ret_format)
 {
-  GdkWindowPrivate *private;
   gulong nitems;
   gulong nbytes;
   gulong length;
@@ -110,17 +101,18 @@ gdk_selection_property_get (GdkWindow  *requestor,
   guchar *t = NULL;
 
   g_return_val_if_fail (requestor != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (requestor), 0);
 
   /* If retrieved chunks are typically small, (and the ICCCM says the
      should be) it would be a win to try first with a buffer of
      moderate length, to avoid two round trips to the server */
 
-  private = (GdkWindowPrivate*) requestor;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (requestor))
     return 0;
 
   t = NULL;
-  XGetWindowProperty (private->xdisplay, private->xwindow,
+  XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (requestor),
+                     GDK_DRAWABLE_XID (requestor),
                      gdk_selection_property, 0, 0, False,
                      AnyPropertyType, &prop_type, &prop_format,
                      &nitems, &nbytes, &t);
@@ -150,7 +142,8 @@ gdk_selection_property_get (GdkWindow  *requestor,
      protocol, in which case the client has to make sure they'll be
      notified of PropertyChange events _before_ the property is deleted.
      Otherwise there's no guarantee we'll win the race ... */
-  XGetWindowProperty (private->xdisplay, private->xwindow,
+  XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (requestor),
+                     GDK_DRAWABLE_XID (requestor),
                      gdk_selection_property, 0, (nbytes + 3) / 4, False,
                      AnyPropertyType, &prop_type, &prop_format,
                      &nitems, &nbytes, &t);
index ddd5267eace60da25de8622994d8dae9699b55f6..16bdb37d7ce8e77ee25b19c7ccb9bfc0670dab76 100644 (file)
@@ -34,6 +34,7 @@
 #include "gdkwindow.h"
 #include "gdkinputprivate.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 #include "MwmUtil.h"
 
 #include <stdlib.h>
@@ -87,7 +88,7 @@ gdk_window_xid_at (Window   base,
                   gboolean excl_child)
 {
   GdkWindow *window;
-  GdkWindowPrivate *private;
+  GdkDrawablePrivate *private;
   Display *disp;
   Window *list = NULL;
   Window child = 0, parent_win = 0, root_win = 0;
@@ -96,7 +97,7 @@ gdk_window_xid_at (Window   base,
   int wx, wy;
   
   window = (GdkWindow*) &gdk_root_parent;
-  private = (GdkWindowPrivate*) window;
+  private = (GdkDrawablePrivate*) window;
   disp = private->xdisplay;
   if (!XGetGeometry (disp, base, &root_win, &wx, &wy, &ww, &wh, &wb, &wd))
     return 0;
@@ -152,15 +153,15 @@ gdk_window_xid_at_coords (gint     x,
                          gboolean excl_child)
 {
   GdkWindow *window;
-  GdkWindowPrivate *private;
+  GdkDrawablePrivate *private;
   Display *disp;
   Window *list = NULL;
   Window root, child = 0, parent_win = 0, root_win = 0;
   unsigned int num;
   int i;
-  
+
   window = (GdkWindow*) &gdk_root_parent;
-  private = (GdkWindowPrivate*) window;
+  private = (GdkDrawablePrivate*) window;
   disp = private->xdisplay;
   root = private->xwindow;
   num = g_list_length (excludes);
@@ -225,15 +226,15 @@ gdk_window_init (void)
                &x, &y, &width, &height, &border_width, &depth);
   XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes);
   
-  gdk_root_parent.xwindow = gdk_root_window;
-  gdk_root_parent.xdisplay = gdk_display;
-  gdk_root_parent.window_type = GDK_WINDOW_ROOT;
-  gdk_root_parent.window.user_data = NULL;
-  gdk_root_parent.width = width;
-  gdk_root_parent.height = height;
+  gdk_root_parent.drawable.xwindow = gdk_root_window;
+  gdk_root_parent.drawable.xdisplay = gdk_display;
+  gdk_root_parent.drawable.window_type = GDK_WINDOW_ROOT;
+  gdk_root_parent.drawable.drawable.user_data = NULL;
+  gdk_root_parent.drawable.width = width;
+  gdk_root_parent.drawable.height = height;
   gdk_root_parent.children = NULL;
-  gdk_root_parent.colormap = NULL;
-  gdk_root_parent.ref_count = 1;
+  gdk_root_parent.drawable.colormap = NULL;
+  gdk_root_parent.drawable.ref_count = 1;
   
   gdk_xid_table_insert (&gdk_root_window, &gdk_root_parent);
 }
@@ -268,23 +269,23 @@ gdk_window_new (GdkWindow     *parent,
     parent = (GdkWindow*) &gdk_root_parent;
   
   parent_private = (GdkWindowPrivate*) parent;
-  if (parent_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (parent))
     return NULL;
   
-  xparent = parent_private->xwindow;
-  parent_display = parent_private->xdisplay;
+  xparent = parent_private->drawable.xwindow;
+  parent_display = parent_private->drawable.xdisplay;
   
   private = g_new (GdkWindowPrivate, 1);
   window = (GdkWindow*) private;
   
   private->parent = parent;
   
-  private->xdisplay = parent_display;
-  private->destroyed = FALSE;
+  private->drawable.xdisplay = parent_display;
+  private->drawable.destroyed = FALSE;
   private->mapped = FALSE;
   private->guffaw_gravity = FALSE;
   private->resize_count = 0;
-  private->ref_count = 1;
+  private->drawable.ref_count = 1;
   xattributes_mask = 0;
   
   if (attributes_mask & GDK_WA_X)
@@ -299,9 +300,9 @@ gdk_window_new (GdkWindow     *parent,
   
   private->x = x;
   private->y = y;
-  private->width = (attributes->width > 1) ? (attributes->width) : (1);
-  private->height = (attributes->height > 1) ? (attributes->height) : (1);
-  private->window_type = attributes->window_type;
+  private->drawable.width = (attributes->width > 1) ? (attributes->width) : (1);
+  private->drawable.height = (attributes->height > 1) ? (attributes->height) : (1);
+  private->drawable.window_type = attributes->window_type;
   private->extension_events = FALSE;
   
   private->filters = NULL;
@@ -346,42 +347,42 @@ gdk_window_new (GdkWindow     *parent,
       depth = visual->depth;
       
       if (attributes_mask & GDK_WA_COLORMAP)
-       private->colormap = attributes->colormap;
+       private->drawable.colormap = attributes->colormap;
       else
        {
          if ((((GdkVisualPrivate*)gdk_visual_get_system ())->xvisual) == xvisual)
-           private->colormap = gdk_colormap_get_system ();
+           private->drawable.colormap = gdk_colormap_get_system ();
          else
-           private->colormap = gdk_colormap_new (visual, False);
+           private->drawable.colormap = gdk_colormap_new (visual, False);
        }
       
       xattributes.background_pixel = BlackPixel (gdk_display, gdk_screen);
       xattributes.border_pixel = BlackPixel (gdk_display, gdk_screen);
       xattributes_mask |= CWBorderPixel | CWBackPixel;
       
-      switch (private->window_type)
+      switch (private->drawable.window_type)
        {
        case GDK_WINDOW_TOPLEVEL:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          
          xparent = gdk_root_window;
          break;
          
        case GDK_WINDOW_CHILD:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          break;
          
        case GDK_WINDOW_DIALOG:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          
          xparent = gdk_root_window;
          break;
          
        case GDK_WINDOW_TEMP:
-         xattributes.colormap = ((GdkColormapPrivate*) private->colormap)->xcolormap;
+         xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap;
          xattributes_mask |= CWColormap;
          
          xparent = gdk_root_window;
@@ -403,18 +404,18 @@ gdk_window_new (GdkWindow     *parent,
     {
       depth = 0;
       class = InputOnly;
-      private->colormap = NULL;
+      private->drawable.colormap = NULL;
     }
   
-  private->xwindow = XCreateWindow (private->xdisplay, xparent,
-                                   x, y, private->width, private->height,
+  private->drawable.xwindow = XCreateWindow (private->drawable.xdisplay, xparent,
+                                   x, y, private->drawable.width, private->drawable.height,
                                    0, depth, class, xvisual,
                                    xattributes_mask, &xattributes);
   gdk_window_ref (window);
-  gdk_xid_table_insert (&private->xwindow, window);
+  gdk_xid_table_insert (&private->drawable.xwindow, window);
   
-  if (private->colormap)
-    gdk_colormap_ref (private->colormap);
+  if (private->drawable.colormap)
+    gdk_colormap_ref (private->drawable.colormap);
   
   gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
                                  (attributes->cursor) :
@@ -423,18 +424,18 @@ gdk_window_new (GdkWindow     *parent,
   if (parent_private)
     parent_private->children = g_list_prepend (parent_private->children, window);
   
-  switch (private->window_type)
+  switch (private->drawable.window_type)
     {
     case GDK_WINDOW_DIALOG:
-      XSetTransientForHint (private->xdisplay, private->xwindow, xparent);
+      XSetTransientForHint (private->drawable.xdisplay, private->drawable.xwindow, xparent);
     case GDK_WINDOW_TOPLEVEL:
     case GDK_WINDOW_TEMP:
-      XSetWMProtocols (private->xdisplay, private->xwindow, gdk_wm_window_protocols, 2);
+      XSetWMProtocols (private->drawable.xdisplay, private->drawable.xwindow, gdk_wm_window_protocols, 2);
       break;
     case GDK_WINDOW_CHILD:
       if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
-         (private->colormap != gdk_colormap_get_system ()) &&
-         (private->colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
+         (private->drawable.colormap != gdk_colormap_get_system ()) &&
+         (private->drawable.colormap != gdk_window_get_colormap (gdk_window_get_toplevel (window))))
        {
          GDK_NOTE (MISC, g_message ("adding colormap window\n"));
          gdk_window_add_colormap_windows (window);
@@ -447,8 +448,8 @@ gdk_window_new (GdkWindow     *parent,
     }
   
   size_hints.flags = PSize;
-  size_hints.width = private->width;
-  size_hints.height = private->height;
+  size_hints.width = private->drawable.width;
+  size_hints.height = private->drawable.height;
   
   wm_hints.flags = InputHint | StateHint | WindowGroupHint;
   wm_hints.window_group = gdk_leader_window;
@@ -459,14 +460,14 @@ gdk_window_new (GdkWindow     *parent,
    * attention to PSize, and even if they do, is this the
    * correct value???
    */
-  XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
+  XSetWMNormalHints (private->drawable.xdisplay, private->drawable.xwindow, &size_hints);
   
-  XSetWMHints (private->xdisplay, private->xwindow, &wm_hints);
+  XSetWMHints (private->drawable.xdisplay, private->drawable.xwindow, &wm_hints);
   
   if (!wm_client_leader_atom)
     wm_client_leader_atom = gdk_atom_intern ("WM_CLIENT_LEADER", FALSE);
   
-  XChangeProperty (private->xdisplay, private->xwindow,
+  XChangeProperty (private->drawable.xdisplay, private->drawable.xwindow,
                   wm_client_leader_atom,
                   XA_WINDOW, 32, PropModeReplace,
                   (guchar*) &gdk_leader_window, 1);
@@ -476,7 +477,7 @@ gdk_window_new (GdkWindow     *parent,
   else
     title = g_get_prgname ();
   
-  XmbSetWMProperties (private->xdisplay, private->xwindow,
+  XmbSetWMProperties (private->drawable.xdisplay, private->drawable.xwindow,
                       title, title,
                       NULL, 0,
                       NULL, NULL, NULL);
@@ -486,7 +487,7 @@ gdk_window_new (GdkWindow     *parent,
       class_hint = XAllocClassHint ();
       class_hint->res_name = attributes->wmclass_name;
       class_hint->res_class = attributes->wmclass_class;
-      XSetClassHint (private->xdisplay, private->xwindow, class_hint);
+      XSetClassHint (private->drawable.xdisplay, private->drawable.xwindow, class_hint);
       XFree (class_hint);
     }
   
@@ -530,21 +531,21 @@ gdk_window_foreign_new (guint32 anid)
   if (parent_private)
     parent_private->children = g_list_prepend (parent_private->children, window);
   
-  private->xwindow = anid;
-  private->xdisplay = gdk_display;
+  private->drawable.xwindow = anid;
+  private->drawable.xdisplay = gdk_display;
   private->x = attrs.x;
   private->y = attrs.y;
-  private->width = attrs.width;
-  private->height = attrs.height;
+  private->drawable.width = attrs.width;
+  private->drawable.height = attrs.height;
   private->resize_count = 0;
-  private->ref_count = 1;
-  private->window_type = GDK_WINDOW_FOREIGN;
-  private->destroyed = FALSE;
+  private->drawable.ref_count = 1;
+  private->drawable.window_type = GDK_WINDOW_FOREIGN;
+  private->drawable.destroyed = FALSE;
   private->mapped = (attrs.map_state != IsUnmapped);
   private->guffaw_gravity = FALSE;
   private->extension_events = 0;
   
-  private->colormap = NULL;
+  private->drawable.colormap = NULL;
   
   private->filters = NULL;
   private->children = NULL;
@@ -552,7 +553,7 @@ gdk_window_foreign_new (guint32 anid)
   window->user_data = NULL;
   
   gdk_window_ref (window);
-  gdk_xid_table_insert (&private->xwindow, window);
+  gdk_xid_table_insert (&private->drawable.xwindow, window);
   
   return window;
 }
@@ -578,14 +579,14 @@ gdk_window_internal_destroy (GdkWindow *window,
   
   private = (GdkWindowPrivate*) window;
   
-  switch (private->window_type)
+  switch (private->drawable.window_type)
     {
     case GDK_WINDOW_TOPLEVEL:
     case GDK_WINDOW_CHILD:
     case GDK_WINDOW_DIALOG:
     case GDK_WINDOW_TEMP:
     case GDK_WINDOW_FOREIGN:
-      if (!private->destroyed)
+      if (!private->drawable.destroyed)
        {
          if (private->parent)
            {
@@ -594,7 +595,7 @@ gdk_window_internal_destroy (GdkWindow *window,
                parent_private->children = g_list_remove (parent_private->children, window);
            }
          
-         if (private->window_type != GDK_WINDOW_FOREIGN)
+         if (GDK_DRAWABLE_TYPE (window) != GDK_WINDOW_FOREIGN)
            {
              children = tmp = private->children;
              private->children = NULL;
@@ -630,7 +631,7 @@ gdk_window_internal_destroy (GdkWindow *window,
              private->filters = NULL;
            }
          
-         if (private->window_type == GDK_WINDOW_FOREIGN)
+         if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
            {
              if (our_destroy && (private->parent != NULL))
                {
@@ -645,26 +646,26 @@ gdk_window_internal_destroy (GdkWindow *window,
                  gdk_window_reparent (window, NULL, 0, 0);
                  
                  xevent.type = ClientMessage;
-                 xevent.window = private->xwindow;
+                 xevent.window = private->drawable.xwindow;
                  xevent.message_type = gdk_wm_protocols;
                  xevent.format = 32;
                  xevent.data.l[0] = gdk_wm_delete_window;
                  xevent.data.l[1] = CurrentTime;
 
-                 XSendEvent (private->xdisplay, private->xwindow,
+                 XSendEvent (private->drawable.xdisplay, private->drawable.xwindow,
                              False, 0, (XEvent *)&xevent);
                  gdk_flush ();
                  gdk_error_trap_pop ();
                }
            }
          else if (xdestroy)
-           XDestroyWindow (private->xdisplay, private->xwindow);
+           XDestroyWindow (private->drawable.xdisplay, private->drawable.xwindow);
          
-         if (private->colormap)
-           gdk_colormap_unref (private->colormap);
+         if (private->drawable.colormap)
+           gdk_colormap_unref (private->drawable.colormap);
          
          private->mapped = FALSE;
-         private->destroyed = TRUE;
+         private->drawable.destroyed = TRUE;
        }
       break;
       
@@ -693,21 +694,17 @@ gdk_window_destroy (GdkWindow *window)
 void
 gdk_window_destroy_notify (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      if (private->window_type != GDK_WINDOW_FOREIGN)
-       g_warning ("GdkWindow %#lx unexpectedly destroyed", private->xwindow);
+      if (GDK_DRAWABLE_TYPE(window) != GDK_WINDOW_FOREIGN)
+       g_warning ("GdkWindow %#lx unexpectedly destroyed", GDK_DRAWABLE_XID (window));
 
       gdk_window_internal_destroy (window, FALSE, FALSE);
     }
   
-  gdk_xid_table_remove (private->xwindow);
+  gdk_xid_table_remove (GDK_DRAWABLE_XID (window));
   gdk_window_unref (window);
 }
 
@@ -717,7 +714,7 @@ gdk_window_ref (GdkWindow *window)
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   g_return_val_if_fail (window != NULL, NULL);
   
-  private->ref_count += 1;
+  private->drawable.ref_count += 1;
   return window;
 }
 
@@ -726,15 +723,14 @@ gdk_window_unref (GdkWindow *window)
 {
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   g_return_if_fail (window != NULL);
-  g_return_if_fail (private->ref_count > 0);
   
-  private->ref_count -= 1;
-  if (private->ref_count == 0)
+  private->drawable.ref_count -= 1;
+  if (private->drawable.ref_count == 0)
     {
-      if (!private->destroyed)
+      if (!private->drawable.destroyed)
        {
-         if (private->window_type == GDK_WINDOW_FOREIGN)
-           gdk_xid_table_remove (private->xwindow);
+         if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
+           gdk_xid_table_remove (private->drawable.xwindow);
          else
            g_warning ("losing last reference to undestroyed window\n");
        }
@@ -751,11 +747,11 @@ gdk_window_show (GdkWindow *window)
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+  if (!private->drawable.destroyed)
     {
       private->mapped = TRUE;
-      XRaiseWindow (private->xdisplay, private->xwindow);
-      XMapWindow (private->xdisplay, private->xwindow);
+      XRaiseWindow (private->drawable.xdisplay, private->drawable.xwindow);
+      XMapWindow (private->drawable.xdisplay, private->drawable.xwindow);
     }
 }
 
@@ -767,10 +763,10 @@ gdk_window_hide (GdkWindow *window)
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+  if (!private->drawable.destroyed)
     {
       private->mapped = FALSE;
-      XUnmapWindow (private->xdisplay, private->xwindow);
+      XUnmapWindow (private->drawable.xdisplay, private->drawable.xwindow);
     }
 }
 
@@ -782,8 +778,8 @@ gdk_window_withdraw (GdkWindow *window)
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
-    XWithdrawWindow (private->xdisplay, private->xwindow, 0);
+  if (!private->drawable.destroyed)
+    XWithdrawWindow (private->drawable.xdisplay, private->drawable.xwindow, 0);
 }
 
 void
@@ -796,11 +792,11 @@ gdk_window_move (GdkWindow *window,
   g_return_if_fail (window != NULL);
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+  if (!private->drawable.destroyed)
     {
-      XMoveWindow (private->xdisplay, private->xwindow, x, y);
+      XMoveWindow (private->drawable.xdisplay, private->drawable.xwindow, x, y);
       
-      if (private->window_type == GDK_WINDOW_CHILD)
+      if (private->drawable.window_type == GDK_WINDOW_CHILD)
        {
          private->x = x;
          private->y = y;
@@ -816,26 +812,29 @@ gdk_window_resize (GdkWindow *window,
   GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   if (width < 1)
     width = 1;
   if (height < 1)
     height = 1;
-  
+
   private = (GdkWindowPrivate*) window;
   
-  if (!private->destroyed &&
+  if (!private->drawable.destroyed &&
       ((private->resize_count > 0) ||
-       (private->width != (guint16) width) ||
-       (private->height != (guint16) height)))
+       (private->drawable.width != (guint16) width) ||
+       (private->drawable.height != (guint16) height)))
     {
-      XResizeWindow (private->xdisplay, private->xwindow, width, height);
+      XResizeWindow (GDK_DRAWABLE_XDISPLAY (private),
+                    GDK_DRAWABLE_XID (private),
+                    width, height);
       private->resize_count += 1;
       
-      if (private->window_type == GDK_WINDOW_CHILD)
+      if (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
        {
-         private->width = width;
-         private->height = height;
+         private->drawable.width = width;
+         private->drawable.height = height;
        }
     }
 }
@@ -850,16 +849,20 @@ gdk_window_move_resize (GdkWindow *window,
   GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
-  
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   if (width < 1)
     width = 1;
   if (height < 1)
     height = 1;
   
   private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
+
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      XMoveResizeWindow (private->xdisplay, private->xwindow, x, y, width, height);
+      XMoveResizeWindow (GDK_DRAWABLE_XDISPLAY (window),
+                        GDK_DRAWABLE_XID (window),
+                        x, y, width, height);
       
       if (private->guffaw_gravity)
        {
@@ -875,12 +878,12 @@ gdk_window_move_resize (GdkWindow *window,
            }
        }
       
-      if (private->window_type == GDK_WINDOW_CHILD)
+      if (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
        {
          private->x = x;
          private->y = y;
-         private->width = width;
-         private->height = height;
+         private->drawable.width = width;
+         private->drawable.height = height;
        }
     }
 }
@@ -896,6 +899,9 @@ gdk_window_reparent (GdkWindow *window,
   GdkWindowPrivate *old_parent_private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  g_return_if_fail (new_parent != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (new_parent));
   
   if (!new_parent)
     new_parent = (GdkWindow*) &gdk_root_parent;
@@ -904,10 +910,10 @@ gdk_window_reparent (GdkWindow *window,
   old_parent_private = (GdkWindowPrivate*)window_private->parent;
   parent_private = (GdkWindowPrivate*) new_parent;
   
-  if (!window_private->destroyed && !parent_private->destroyed)
-    XReparentWindow (window_private->xdisplay,
-                    window_private->xwindow,
-                    parent_private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window) && !GDK_DRAWABLE_DESTROYED (new_parent))
+    XReparentWindow (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    GDK_DRAWABLE_XID (new_parent),
                     x, y);
   
   window_private->parent = new_parent;
@@ -926,14 +932,11 @@ gdk_window_reparent (GdkWindow *window,
 void
 gdk_window_clear (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XClearWindow (private->xdisplay, private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XClearWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window));
 }
 
 void
@@ -943,14 +946,11 @@ gdk_window_clear_area (GdkWindow *window,
                       gint       width,
                       gint       height)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XClearArea (private->xdisplay, private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XClearArea (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                x, y, width, height, False);
 }
 
@@ -961,76 +961,32 @@ gdk_window_clear_area_e (GdkWindow *window,
                         gint       width,
                         gint       height)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XClearArea (private->xdisplay, private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XClearArea (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                x, y, width, height, True);
 }
 
-void
-gdk_window_copy_area (GdkWindow    *window,
-                     GdkGC        *gc,
-                     gint          x,
-                     gint          y,
-                     GdkWindow    *source_window,
-                     gint          source_x,
-                     gint          source_y,
-                     gint          width,
-                     gint          height)
-{
-  GdkWindowPrivate *src_private;
-  GdkWindowPrivate *dest_private;
-  GdkGCPrivate *gc_private;
-  
-  g_return_if_fail (window != NULL);
-  g_return_if_fail (gc != NULL);
-  
-  if (source_window == NULL)
-    source_window = window;
-  
-  src_private = (GdkWindowPrivate*) source_window;
-  dest_private = (GdkWindowPrivate*) window;
-  gc_private = (GdkGCPrivate*) gc;
-  
-  if (!src_private->destroyed && !dest_private->destroyed)
-    {
-      XCopyArea (dest_private->xdisplay, src_private->xwindow, dest_private->xwindow,
-                gc_private->xgc,
-                source_x, source_y,
-                width, height,
-                x, y);
-    }
-}
-
 void
 gdk_window_raise (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XRaiseWindow (private->xdisplay, private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XRaiseWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window));
 }
 
 void
 gdk_window_lower (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
-    XLowerWindow (private->xdisplay, private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XLowerWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window));
 }
 
 void
@@ -1052,13 +1008,12 @@ gdk_window_set_hints (GdkWindow *window,
                      gint       max_height,
                      gint       flags)
 {
-  GdkWindowPrivate *private;
   XSizeHints size_hints;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   size_hints.flags = 0;
@@ -1087,7 +1042,9 @@ gdk_window_set_hints (GdkWindow *window,
   /* FIXME: Would it be better to delete this property of
    *        flags == 0? It would save space on the server
    */
-  XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
+  XSetWMNormalHints (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    &size_hints);
 }
 
 void 
@@ -1095,13 +1052,12 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
                               GdkGeometry    *geometry,
                               GdkWindowHints  geom_mask)
 {
-  GdkWindowPrivate *private;
   XSizeHints size_hints;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   size_hints.flags = 0;
@@ -1173,20 +1129,21 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
   /* FIXME: Would it be better to delete this property of
    *        geom_mask == 0? It would save space on the server
    */
-  XSetWMNormalHints (private->xdisplay, private->xwindow, &size_hints);
+  XSetWMNormalHints (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    &size_hints);
 }
 
 void
 gdk_window_set_title (GdkWindow   *window,
                      const gchar *title)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
-    XmbSetWMProperties (private->xdisplay, private->xwindow,
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XmbSetWMProperties (GDK_DRAWABLE_XDISPLAY (window),
+                       GDK_DRAWABLE_XID (window),
                        title, title, NULL, 0, NULL, NULL, NULL);
 }
 
@@ -1194,19 +1151,19 @@ void
 gdk_window_set_role (GdkWindow   *window,
                     const gchar *role)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
-  
-  private = (GdkWindowPrivate*) window;
-  
-  if (role)
-    XChangeProperty (private->xdisplay, private->xwindow,
-                    gdk_atom_intern ("WM_WINDOW_ROLE", FALSE), XA_STRING,
-                    8, PropModeReplace, role, strlen (role));
-  else
-    XDeleteProperty (private->xdisplay, private->xwindow,
-                    gdk_atom_intern ("WM_WINDOW_ROLE", FALSE));
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    {
+      if (role)
+       XChangeProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
+                        gdk_atom_intern ("WM_WINDOW_ROLE", FALSE), XA_STRING,
+                        8, PropModeReplace, role, strlen (role));
+      else
+       XDeleteProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
+                        gdk_atom_intern ("WM_WINDOW_ROLE", FALSE));
+    }
 }
 
 void          
@@ -1217,26 +1174,27 @@ gdk_window_set_transient_for (GdkWindow *window,
   GdkWindowPrivate *parent_private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   private = (GdkWindowPrivate*) window;
   parent_private = (GdkWindowPrivate*) parent;
   
-  if (!private->destroyed && !parent_private->destroyed)
-    XSetTransientForHint (private->xdisplay, 
-                         private->xwindow, parent_private->xwindow);
+  if (!GDK_DRAWABLE_DESTROYED (window) && !GDK_DRAWABLE_DESTROYED (parent))
+    XSetTransientForHint (GDK_DRAWABLE_XDISPLAY (window), 
+                         GDK_DRAWABLE_XID (window),
+                         GDK_DRAWABLE_XID (parent));
 }
 
 void
 gdk_window_set_background (GdkWindow *window,
                           GdkColor  *color)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (!private->destroyed)
-    XSetWindowBackground (private->xdisplay, private->xwindow, color->pixel);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XSetWindowBackground (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window), color->pixel);
 }
 
 void
@@ -1244,38 +1202,34 @@ gdk_window_set_back_pixmap (GdkWindow *window,
                            GdkPixmap *pixmap,
                            gint       parent_relative)
 {
-  GdkWindowPrivate *window_private;
-  GdkPixmapPrivate *pixmap_private;
   Pixmap xpixmap;
   
   g_return_if_fail (window != NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  pixmap_private = (GdkPixmapPrivate*) pixmap;
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   if (pixmap)
-    xpixmap = pixmap_private->xwindow;
+    xpixmap = GDK_DRAWABLE_XID (pixmap);
   else
     xpixmap = None;
   
   if (parent_relative)
     xpixmap = ParentRelative;
   
-  if (!window_private->destroyed)
-    XSetWindowBackgroundPixmap (window_private->xdisplay, window_private->xwindow, xpixmap);
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XSetWindowBackgroundPixmap (GDK_DRAWABLE_XDISPLAY (window),
+                               GDK_DRAWABLE_XID (window), xpixmap);
 }
 
 void
 gdk_window_set_cursor (GdkWindow *window,
                       GdkCursor *cursor)
 {
-  GdkWindowPrivate *window_private;
   GdkCursorPrivate *cursor_private;
   Cursor xcursor;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  window_private = (GdkWindowPrivate*) window;
   cursor_private = (GdkCursorPrivate*) cursor;
   
   if (!cursor)
@@ -1283,37 +1237,10 @@ gdk_window_set_cursor (GdkWindow *window,
   else
     xcursor = cursor_private->xcursor;
   
-  if (!window_private->destroyed)
-    XDefineCursor (window_private->xdisplay, window_private->xwindow, xcursor);
-}
-
-void
-gdk_window_set_colormap (GdkWindow   *window,
-                        GdkColormap *colormap)
-{
-  GdkWindowPrivate *window_private;
-  GdkColormapPrivate *colormap_private;
-  
-  g_return_if_fail (window != NULL);
-  g_return_if_fail (colormap != NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  colormap_private = (GdkColormapPrivate*) colormap;
-  
-  if (!window_private->destroyed)
-    {
-      XSetWindowColormap (window_private->xdisplay,
-                         window_private->xwindow,
-                         colormap_private->xcolormap);
-      
-      if (window_private->colormap)
-       gdk_colormap_unref (window_private->colormap);
-      window_private->colormap = colormap;
-      gdk_colormap_ref (window_private->colormap);
-      
-      if (window_private->window_type != GDK_WINDOW_TOPLEVEL)
-       gdk_window_add_colormap_windows (window);
-    }
+  if (!GDK_DRAWABLE_DESTROYED (window))
+    XDefineCursor (GDK_DRAWABLE_XDISPLAY (window),
+                  GDK_DRAWABLE_XID (window),
+                  xcursor);
 }
 
 void
@@ -1333,7 +1260,6 @@ gdk_window_get_geometry (GdkWindow *window,
                         gint      *height,
                         gint      *depth)
 {
-  GdkWindowPrivate *window_private;
   Window root;
   gint tx;
   gint ty;
@@ -1342,14 +1268,15 @@ gdk_window_get_geometry (GdkWindow *window,
   guint tborder_width;
   guint tdepth;
   
-  if (!window)
-    window = (GdkWindow*) &gdk_root_parent;
+  g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
   
-  window_private = (GdkWindowPrivate*) window;
+  if (!window)
+    window = (GdkWindow *) &gdk_root_parent;
   
-  if (!window_private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      XGetGeometry (window_private->xdisplay, window_private->xwindow,
+      XGetGeometry (GDK_DRAWABLE_XDISPLAY (window),
+                   GDK_DRAWABLE_XID (window),
                    &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
       
       if (x)
@@ -1373,6 +1300,7 @@ gdk_window_get_position (GdkWindow *window,
   GdkWindowPrivate *window_private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   window_private = (GdkWindowPrivate*) window;
   
@@ -1382,97 +1310,11 @@ gdk_window_get_position (GdkWindow *window,
     *y = window_private->y;
 }
 
-void
-gdk_window_get_size (GdkWindow *window,
-                    gint       *width,
-                    gint       *height)
-{
-  GdkWindowPrivate *window_private;
-  
-  g_return_if_fail (window != NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  
-  if (width)
-    *width = window_private->width;
-  if (height)
-    *height = window_private->height;
-}
-
-GdkVisual*
-gdk_window_get_visual (GdkWindow *window)
-{
-  GdkWindowPrivate *window_private;
-  XWindowAttributes window_attributes;
-  
-  g_return_val_if_fail (window != NULL, NULL);
-  
-  window_private = (GdkWindowPrivate*) window;
-  /* Huh? ->parent is never set for a pixmap. We should just return
-   * null immeditately
-   */
-  while (window_private && (window_private->window_type == GDK_WINDOW_PIXMAP))
-    window_private = (GdkWindowPrivate*) window_private->parent;
-  
-  if (window_private && !window_private->destroyed)
-    {
-      if (window_private->colormap == NULL)
-       {
-         XGetWindowAttributes (window_private->xdisplay,
-                               window_private->xwindow,
-                               &window_attributes);
-         return gdk_visual_lookup (window_attributes.visual);
-       }
-      else
-       return ((GdkColormapPrivate *)window_private->colormap)->visual;
-    }
-  
-  return NULL;
-}
-
-GdkColormap*
-gdk_window_get_colormap (GdkWindow *window)
-{
-  GdkWindowPrivate *window_private;
-  XWindowAttributes window_attributes;
-  
-  g_return_val_if_fail (window != NULL, NULL);
-  window_private = (GdkWindowPrivate*) window;
-  
-  g_return_val_if_fail (window_private->window_type != GDK_WINDOW_PIXMAP, NULL);
-  if (!window_private->destroyed)
-    {
-      if (window_private->colormap == NULL)
-       {
-         XGetWindowAttributes (window_private->xdisplay,
-                               window_private->xwindow,
-                               &window_attributes);
-         return gdk_colormap_lookup (window_attributes.colormap);
-       }
-      else
-       return window_private->colormap;
-    }
-  
-  return NULL;
-}
-
-GdkWindowType
-gdk_window_get_type (GdkWindow *window)
-{
-  GdkWindowPrivate *window_private;
-  
-  g_return_val_if_fail (window != NULL, (GdkWindowType) -1);
-  
-  window_private = (GdkWindowPrivate*) window;
-  return window_private->window_type;
-}
-
 gint
 gdk_window_get_origin (GdkWindow *window,
                       gint      *x,
                       gint      *y)
 {
-  GdkWindowPrivate *private;
   gint return_val;
   Window child;
   gint tx = 0;
@@ -1480,12 +1322,10 @@ gdk_window_get_origin (GdkWindow *window,
   
   g_return_val_if_fail (window != NULL, 0);
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      return_val = XTranslateCoordinates (private->xdisplay,
-                                         private->xwindow,
+      return_val = XTranslateCoordinates (GDK_DRAWABLE_XDISPLAY (window),
+                                         GDK_DRAWABLE_XID (window),
                                          gdk_root_window,
                                          0, 0, &tx, &ty,
                                          &child);
@@ -1507,7 +1347,6 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
                                    gint      *x,
                                    gint      *y)
 {
-  GdkWindowPrivate *private;
   gboolean return_val = FALSE;
   gint num_children, format_return;
   Window win, *child, parent, root;
@@ -1519,16 +1358,15 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
   guchar *data_return;
   
   g_return_val_if_fail (window != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
   
-  private = (GdkWindowPrivate*) window;
-  
-  if (!private->destroyed)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
       if (!atom)
-       atom = XInternAtom (private->xdisplay, "ENLIGHTENMENT_DESKTOP", False);
-      win = private->xwindow;
+       atom = gdk_atom_intern ("ENLIGHTENMENT_DESKTOP", FALSE);
+      win = GDK_DRAWABLE_XID (window);
       
-      while (XQueryTree (private->xdisplay, win, &root, &parent,
+      while (XQueryTree (GDK_DRAWABLE_XDISPLAY (window), win, &root, &parent,
                         &child, (unsigned int *)&num_children))
        {
          if ((child) && (num_children > 0))
@@ -1543,7 +1381,7 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
            break;
          
          data_return = NULL;
-         XGetWindowProperty (private->xdisplay, win, atom, 0, 0,
+         XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (window), win, atom, 0, 0,
                              False, XA_CARDINAL, &type_return, &format_return,
                              &number_return, &bytes_after_return, &data_return);
          if (type_return == XA_CARDINAL)
@@ -1553,8 +1391,8 @@ gdk_window_get_deskrelative_origin (GdkWindow *window,
            }
        }
       
-      return_val = XTranslateCoordinates (private->xdisplay,
-                                         private->xwindow,
+      return_val = XTranslateCoordinates (GDK_DRAWABLE_XDISPLAY (window),
+                                         GDK_DRAWABLE_XID (window),
                                          win,
                                          0, 0, &tx, &ty,
                                          &root);
@@ -1581,25 +1419,27 @@ gdk_window_get_root_origin (GdkWindow *window,
   unsigned int nchildren;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   private = (GdkWindowPrivate*) window;
   if (x)
     *x = 0;
   if (y)
     *y = 0;
-  if (private->destroyed)
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   while (private->parent && ((GdkWindowPrivate*) private->parent)->parent)
     private = (GdkWindowPrivate*) private->parent;
-  if (private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
-  xparent = private->xwindow;
+  xparent = GDK_DRAWABLE_XID (window);
   do
     {
       xwindow = xparent;
-      if (!XQueryTree (private->xdisplay, xwindow,
+      if (!XQueryTree (GDK_DRAWABLE_XDISPLAY (window), xwindow,
                       &root, &xparent,
                       &children, &nchildren))
        return;
@@ -1614,7 +1454,7 @@ gdk_window_get_root_origin (GdkWindow *window,
       unsigned int ww, wh, wb, wd;
       int wx, wy;
       
-      if (XGetGeometry (private->xdisplay, xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
+      if (XGetGeometry (GDK_DRAWABLE_XDISPLAY (window), xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
        {
          if (x)
            *x = wx;
@@ -1630,7 +1470,6 @@ gdk_window_get_pointer (GdkWindow       *window,
                        gint            *y,
                        GdkModifierType *mask)
 {
-  GdkWindowPrivate *private;
   GdkWindow *return_val;
   Window root;
   Window child;
@@ -1638,16 +1477,17 @@ gdk_window_get_pointer (GdkWindow       *window,
   int winx = 0;
   int winy = 0;
   unsigned int xmask = 0;
+
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
   
   if (!window)
     window = (GdkWindow*) &gdk_root_parent;
   
-  private = (GdkWindowPrivate*) window;
-  
   return_val = NULL;
-  if (!private->destroyed &&
-      XQueryPointer (private->xdisplay, private->xwindow, &root, &child,
-                    &rootx, &rooty, &winx, &winy, &xmask))
+  if (!GDK_DRAWABLE_DESTROYED (window) &&
+      XQueryPointer (GDK_DRAWABLE_XDISPLAY (window),
+                    GDK_DRAWABLE_XID (window),
+                    &root, &child, &rootx, &rooty, &winx, &winy, &xmask))
     {
       if (child)
        return_val = gdk_window_lookup (child);
@@ -1678,20 +1518,20 @@ gdk_window_at_pointer (gint *win_x,
   
   private = &gdk_root_parent;
   
-  xwindow = private->xwindow;
+  xwindow = private->drawable.xwindow;
   
-  XGrabServer (private->xdisplay);
+  XGrabServer (private->drawable.xdisplay);
   while (xwindow)
     {
       xwindow_last = xwindow;
-      XQueryPointer (private->xdisplay,
+      XQueryPointer (private->drawable.xdisplay,
                     xwindow,
                     &root, &xwindow,
                     &rootx, &rooty,
                     &winx, &winy,
                     &xmask);
     }
-  XUngrabServer (private->xdisplay);
+  XUngrabServer (private->drawable.xdisplay);
   
   window = gdk_window_lookup (xwindow_last);
   
@@ -1707,6 +1547,7 @@ GdkWindow*
 gdk_window_get_parent (GdkWindow *window)
 {
   g_return_val_if_fail (window != NULL, NULL);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
   
   return ((GdkWindowPrivate*) window)->parent;
 }
@@ -1717,22 +1558,18 @@ gdk_window_get_toplevel (GdkWindow *window)
   GdkWindowPrivate *private;
   
   g_return_val_if_fail (window != NULL, NULL);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+  private = (GdkWindowPrivate *)window;
+  while (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD)
+    private = (GdkWindowPrivate *)private->parent;
   
-  private = (GdkWindowPrivate*) window;
-  
-  while (private->window_type == GDK_WINDOW_CHILD)
-    {
-      window = ((GdkWindowPrivate*) window)->parent;
-      private = (GdkWindowPrivate*) window;
-    }
-  
-  return window;
+  return (GdkWindow *)window;
 }
 
 GList*
 gdk_window_get_children (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
   GdkWindow *child;
   GList *children;
   Window root;
@@ -1742,12 +1579,13 @@ gdk_window_get_children (GdkWindow *window)
   unsigned int i;
   
   g_return_val_if_fail (window != NULL, NULL);
-  
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
   
-  XQueryTree (private->xdisplay, private->xwindow,
+  XQueryTree (GDK_DRAWABLE_XDISPLAY (window),
+             GDK_DRAWABLE_XID (window),
              &root, &parent, &xchildren, &nchildren);
   
   children = NULL;
@@ -1771,83 +1609,82 @@ gdk_window_get_children (GdkWindow *window)
 GdkEventMask  
 gdk_window_get_events (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
   XWindowAttributes attrs;
   GdkEventMask event_mask;
   int i;
   
   g_return_val_if_fail (window != NULL, 0);
-  
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return 0;
-  
-  XGetWindowAttributes (gdk_display, private->xwindow, 
-                       &attrs);
-  
-  event_mask = 0;
-  for (i = 0; i < gdk_nevent_masks; i++)
+  else
     {
-      if (attrs.your_event_mask & gdk_event_mask_table[i])
-       event_mask |= 1 << (i + 1);
-    }
+      XGetWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                           GDK_DRAWABLE_XID (window), 
+                           &attrs);
+      
+      event_mask = 0;
+      for (i = 0; i < gdk_nevent_masks; i++)
+       {
+         if (attrs.your_event_mask & gdk_event_mask_table[i])
+           event_mask |= 1 << (i + 1);
+       }
   
-  return event_mask;
+      return event_mask;
+    }
 }
 
 void          
 gdk_window_set_events (GdkWindow       *window,
                       GdkEventMask     event_mask)
 {
-  GdkWindowPrivate *private;
   long xevent_mask;
   int i;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  xevent_mask = StructureNotifyMask;
-  for (i = 0; i < gdk_nevent_masks; i++)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      if (event_mask & (1 << (i + 1)))
-       xevent_mask |= gdk_event_mask_table[i];
+      xevent_mask = StructureNotifyMask;
+      for (i = 0; i < gdk_nevent_masks; i++)
+       {
+         if (event_mask & (1 << (i + 1)))
+           xevent_mask |= gdk_event_mask_table[i];
+       }
+      
+      XSelectInput (GDK_DRAWABLE_XDISPLAY (window),
+                   GDK_DRAWABLE_XID (window),
+                   xevent_mask);
     }
-  
-  XSelectInput (gdk_display, private->xwindow, 
-               xevent_mask);
 }
 
 void
 gdk_window_add_colormap_windows (GdkWindow *window)
 {
   GdkWindow *toplevel;
-  GdkWindowPrivate *toplevel_private;
-  GdkWindowPrivate *window_private;
   Window *old_windows;
   Window *new_windows;
   int i, count;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
   toplevel = gdk_window_get_toplevel (window);
-  toplevel_private = (GdkWindowPrivate*) toplevel;
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (toplevel))
     return;
   
   old_windows = NULL;
-  if (!XGetWMColormapWindows (toplevel_private->xdisplay,
-                             toplevel_private->xwindow,
+  if (!XGetWMColormapWindows (GDK_DRAWABLE_XDISPLAY (toplevel),
+                             GDK_DRAWABLE_XID (toplevel),
                              &old_windows, &count))
     {
       count = 0;
     }
   
   for (i = 0; i < count; i++)
-    if (old_windows[i] == window_private->xwindow)
+    if (old_windows[i] == GDK_DRAWABLE_XID (window))
       {
        XFree (old_windows);
        return;
@@ -1857,10 +1694,10 @@ gdk_window_add_colormap_windows (GdkWindow *window)
   
   for (i = 0; i < count; i++)
     new_windows[i] = old_windows[i];
-  new_windows[count] = window_private->xwindow;
+  new_windows[count] = GDK_DRAWABLE_XID (window);
   
-  XSetWMColormapWindows (toplevel_private->xdisplay,
-                        toplevel_private->xwindow,
+  XSetWMColormapWindows (GDK_DRAWABLE_XDISPLAY (toplevel),
+                        GDK_DRAWABLE_XID (toplevel),
                         new_windows, count + 1);
   
   g_free (new_windows);
@@ -1896,24 +1733,20 @@ gdk_window_shape_combine_mask (GdkWindow *window,
                               GdkBitmap *mask,
                               gint x, gint y)
 {
-  GdkWindowPrivate *window_private;
   Pixmap pixmap;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
 #ifdef HAVE_SHAPE_EXT
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   if (gdk_window_have_shape_ext ())
     {
       if (mask)
        {
-         GdkWindowPrivate *pixmap_private;
-         
-         pixmap_private = (GdkWindowPrivate*) mask;
-         pixmap = (Pixmap) pixmap_private->xwindow;
+         pixmap = GDK_DRAWABLE_XID (mask);
        }
       else
        {
@@ -1922,8 +1755,8 @@ gdk_window_shape_combine_mask (GdkWindow *window,
          pixmap = None;
        }
       
-      XShapeCombineMask (window_private->xdisplay,
-                        window_private->xwindow,
+      XShapeCombineMask (GDK_DRAWABLE_XDISPLAY (window),
+                        GDK_DRAWABLE_XID (window),
                         ShapeBounding,
                         x, y,
                         pixmap,
@@ -1941,8 +1774,11 @@ gdk_window_add_filter (GdkWindow     *window,
   GList *tmp_list;
   GdkEventFilter *filter;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   private = (GdkWindowPrivate*) window;
-  if (private && private->destroyed)
+  if (private && GDK_DRAWABLE_DESTROYED (window))
     return;
   
   if (private)
@@ -1977,6 +1813,9 @@ gdk_window_remove_filter (GdkWindow     *window,
   GList *tmp_list, *node;
   GdkEventFilter *filter;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   private = (GdkWindowPrivate*) window;
   
   if (private)
@@ -2008,19 +1847,19 @@ void
 gdk_window_set_override_redirect (GdkWindow *window,
                                  gboolean override_redirect)
 {
-  GdkWindowPrivate *private;
   XSetWindowAttributes attr;
   
   g_return_if_fail (window != NULL);
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  attr.override_redirect = (override_redirect == FALSE)?False:True;
-  XChangeWindowAttributes (gdk_display,
-                          ((GdkWindowPrivate *)window)->xwindow,
-                          CWOverrideRedirect,
-                          &attr);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (GDK_DRAWABLE_DESTROYED (window))
+    {
+      attr.override_redirect = (override_redirect == FALSE)?False:True;
+      XChangeWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                              GDK_DRAWABLE_XID (window),
+                              CWOverrideRedirect,
+                              &attr);
+    }
 }
 
 void          
@@ -2030,40 +1869,38 @@ gdk_window_set_icon (GdkWindow *window,
                     GdkBitmap *mask)
 {
   XWMHints *wm_hints;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
 
-  wm_hints = XGetWMHints (window_private->xdisplay, window_private->xwindow);
+  wm_hints = XGetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window));
   if (!wm_hints)
     wm_hints = XAllocWMHints ();
 
   if (icon_window != NULL)
     {
-      private = (GdkWindowPrivate *)icon_window;
       wm_hints->flags |= IconWindowHint;
-      wm_hints->icon_window = private->xwindow;
+      wm_hints->icon_window = GDK_DRAWABLE_XID (icon_window);
     }
   
   if (pixmap != NULL)
     {
-      private = (GdkWindowPrivate *)pixmap;
       wm_hints->flags |= IconPixmapHint;
-      wm_hints->icon_pixmap = private->xwindow;
+      wm_hints->icon_pixmap = GDK_DRAWABLE_XID (pixmap);
     }
   
   if (mask != NULL)
     {
-      private = (GdkWindowPrivate *)mask;
       wm_hints->flags |= IconMaskHint;
-      wm_hints->icon_mask = private->xwindow;
+      wm_hints->icon_mask = GDK_DRAWABLE_XID (mask);
     }
 
-  XSetWMHints (window_private->xdisplay, window_private->xwindow, wm_hints);
+  XSetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+              GDK_DRAWABLE_XID (window), wm_hints);
   XFree (wm_hints);
 }
 
@@ -2071,15 +1908,16 @@ void
 gdk_window_set_icon_name (GdkWindow *window, 
                          gchar *    name)
 {
-  GdkWindowPrivate *window_private;
   XTextProperty property;
   gint res;
   
   g_return_if_fail (window != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
-  res = XmbTextListToTextProperty (window_private->xdisplay,
+  
+  res = XmbTextListToTextProperty (GDK_DRAWABLE_XDISPLAY (window),
                                   &name, 1, XStdICCTextStyle,
                                           &property);
   if (res < 0)
@@ -2088,7 +1926,8 @@ gdk_window_set_icon_name (GdkWindow *window,
       return;
     }
   
-  XSetWMIconName (window_private->xdisplay, window_private->xwindow,
+  XSetWMIconName (GDK_DRAWABLE_XDISPLAY (window),
+                 GDK_DRAWABLE_XID (window),
                  &property);
   
   if (property.value)
@@ -2100,25 +1939,25 @@ gdk_window_set_group (GdkWindow *window,
                      GdkWindow *leader)
 {
   XWMHints *wm_hints;
-  GdkWindowPrivate *window_private;
-  GdkWindowPrivate *private;
   
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   g_return_if_fail (leader != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  g_return_if_fail (GDK_IS_WINDOW (leader));
+
+  if (GDK_DRAWABLE_DESTROYED (window) || GDK_DRAWABLE_DESTROYED (leader))
     return;
   
-  private = (GdkWindowPrivate *)leader;
-
-  wm_hints = XGetWMHints (window_private->xdisplay, window_private->xwindow);
+  wm_hints = XGetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window));
   if (!wm_hints)
     wm_hints = XAllocWMHints ();
 
   wm_hints->flags |= WindowGroupHint;
-  wm_hints->window_group = private->xwindow;
+  wm_hints->window_group = GDK_DRAWABLE_XID (leader);
 
-  XSetWMHints (window_private->xdisplay, window_private->xwindow, wm_hints);
+  XSetWMHints (GDK_DRAWABLE_XDISPLAY (window),
+              GDK_DRAWABLE_XID (window), wm_hints);
   XFree (wm_hints);
 }
 
@@ -2133,18 +1972,14 @@ gdk_window_set_mwm_hints (GdkWindow *window,
   gulong nitems;
   gulong bytes_after;
   
-  GdkWindowPrivate *window_private;
-  
-  g_return_if_fail (window != NULL);
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
   if (!hints_atom)
-    hints_atom = XInternAtom (window_private->xdisplay
+    hints_atom = XInternAtom (GDK_DRAWABLE_XDISPLAY (window)
                              _XA_MOTIF_WM_HINTS, FALSE);
   
-  XGetWindowProperty (window_private->xdisplay, window_private->xwindow,
+  XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                      hints_atom, 0, sizeof (MotifWmHints)/sizeof (long),
                      False, AnyPropertyType, &type, &format, &nitems,
                      &bytes_after, (guchar **)&hints);
@@ -2165,7 +2000,7 @@ gdk_window_set_mwm_hints (GdkWindow *window,
        }
     }
   
-  XChangeProperty (window_private->xdisplay, window_private->xwindow,
+  XChangeProperty (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window),
                   hints_atom, hints_atom, 32, PropModeReplace,
                   (guchar *)hints, sizeof (MotifWmHints)/sizeof (long));
   
@@ -2179,6 +2014,9 @@ gdk_window_set_decorations (GdkWindow      *window,
 {
   MotifWmHints hints;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  
   hints.flags = MWM_HINTS_DECORATIONS;
   hints.decorations = decorations;
   
@@ -2191,6 +2029,9 @@ gdk_window_set_functions (GdkWindow    *window,
 {
   MotifWmHints hints;
   
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  
   hints.flags = MWM_HINTS_FUNCTIONS;
   hints.functions = functions;
   
@@ -2529,34 +2370,28 @@ gdk_propagate_shapes (Display *disp,
 void
 gdk_window_set_child_shapes (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
 #ifdef HAVE_SHAPE_EXT
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  if (gdk_window_have_shape_ext ())
-    gdk_propagate_shapes (private->xdisplay, private->xwindow, FALSE);
+  if (!GDK_DRAWABLE_DESTROYED (window) &&
+      gdk_window_have_shape_ext ())
+    gdk_propagate_shapes (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window), FALSE);
 #endif   
 }
 
 void
 gdk_window_merge_child_shapes (GdkWindow *window)
 {
-  GdkWindowPrivate *private;
-  
   g_return_if_fail (window != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
   
 #ifdef HAVE_SHAPE_EXT
-  private = (GdkWindowPrivate*) window;
-  if (private->destroyed)
-    return;
-  
-  if (gdk_window_have_shape_ext ())
-    gdk_propagate_shapes (private->xdisplay, private->xwindow, TRUE);
+  if (!GDK_DRAWABLE_DESTROYED (window) &&
+      gdk_window_have_shape_ext ())
+    gdk_propagate_shapes (GDK_DRAWABLE_XDISPLAY (window),
+                         GDK_DRAWABLE_XID (window), TRUE);
 #endif   
 }
 
@@ -2575,6 +2410,7 @@ gdk_window_is_visible (GdkWindow *window)
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   
   g_return_val_if_fail (window != NULL, FALSE);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
   
   return private->mapped;
 }
@@ -2597,10 +2433,11 @@ gdk_window_is_viewable (GdkWindow *window)
   GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   
   g_return_val_if_fail (window != NULL, FALSE);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
   
   while (private && 
         (private != &gdk_root_parent) &&
-        (private->window_type != GDK_WINDOW_FOREIGN))
+        (private->drawable.window_type != GDK_WINDOW_FOREIGN))
     {
       if (!private->mapped)
        return FALSE;
@@ -2611,16 +2448,6 @@ gdk_window_is_viewable (GdkWindow *window)
   return TRUE;
 }
 
-void          
-gdk_drawable_set_data (GdkDrawable   *drawable,
-                      const gchar   *key,
-                      gpointer       data,
-                      GDestroyNotify destroy_func)
-{
-  g_dataset_set_data_full (drawable, key, data, destroy_func);
-}
-
-
 /* Support for windows that can be guffaw-scrolled
  * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
  */
@@ -2685,29 +2512,27 @@ gdk_window_gravity_works (void)
 static void
 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   XSetWindowAttributes xattributes;
   
   g_return_if_fail (window != NULL);
   
   xattributes.bit_gravity = on ? StaticGravity : ForgetGravity;
-  XChangeWindowAttributes (private->xdisplay,
-                          private->xwindow,
+  XChangeWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                          GDK_DRAWABLE_XID (window),
                           CWBitGravity,  &xattributes);
 }
 
 static void
 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
 {
-  GdkWindowPrivate *private = (GdkWindowPrivate *)window;
   XSetWindowAttributes xattributes;
   
   g_return_if_fail (window != NULL);
   
   xattributes.win_gravity = on ? StaticGravity : NorthWestGravity;
   
-  XChangeWindowAttributes (private->xdisplay,
-                          private->xwindow,
+  XChangeWindowAttributes (GDK_DRAWABLE_XDISPLAY (window),
+                          GDK_DRAWABLE_XID (window),
                           CWWinGravity,  &xattributes);
 }
 
@@ -2731,7 +2556,8 @@ gdk_window_set_static_gravities (GdkWindow *window,
   GList *tmp_list;
   
   g_return_val_if_fail (window != NULL, FALSE);
-  
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
+
   if (!use_static == !private->guffaw_gravity)
     return TRUE;
   
@@ -2740,14 +2566,17 @@ gdk_window_set_static_gravities (GdkWindow *window,
   
   private->guffaw_gravity = use_static;
   
-  gdk_window_set_static_bit_gravity (window, use_static);
-  
-  tmp_list = private->children;
-  while (tmp_list)
+  if (!GDK_DRAWABLE_DESTROYED (window))
     {
-      gdk_window_set_static_win_gravity (window, use_static);
+      gdk_window_set_static_bit_gravity (window, use_static);
       
-      tmp_list = tmp_list->next;
+      tmp_list = private->children;
+      while (tmp_list)
+       {
+         gdk_window_set_static_win_gravity (window, use_static);
+         
+         tmp_list = tmp_list->next;
+       }
     }
   
   return TRUE;
index 995c9dca97bae332058be9df234a3d1ef241a70b..4f142bd1ef30cf03ffba4ef276f72aa2d0898a49 100644 (file)
 #define GDK_ROOT_WINDOW()             gdk_root_window
 #define GDK_ROOT_PARENT()             ((GdkWindow *)&gdk_root_parent)
 #define GDK_DISPLAY()                 gdk_display
-#define GDK_WINDOW_XDISPLAY(win)      (((GdkWindowPrivate*) win)->xdisplay)
-#define GDK_WINDOW_XWINDOW(win)       (((GdkWindowPrivate*) win)->xwindow)
+#define GDK_DRAWABLE_XDISPLAY(win)    (((GdkDrawablePrivate*) win)->xdisplay)
+#define GDK_DRAWABLE_XID(win)         (((GdkDrawablePrivate*) win)->xwindow)
+#define GDK_WINDOW_XDISPLAY           GDK_DRAWABLE_XDISPLAY
+#define GDK_WINDOW_XWINDOW            GDK_DRAWABLE_XID
 #define GDK_IMAGE_XDISPLAY(image)     (((GdkImagePrivate*) image)->xdisplay)
 #define GDK_IMAGE_XIMAGE(image)       (((GdkImagePrivate*) image)->ximage)
 #define GDK_GC_XDISPLAY(gc)           (((GdkGCPrivate*) gc)->xdisplay)
index 515937b38b25cd7cd7e3ee92fcc5439c4b546679..4dc265560c473dec1f551b400a72e32e0546ee21 100644 (file)
@@ -171,7 +171,7 @@ gtk_plug_realize (GtkWidget *widget)
       widget->window = gdk_window_new (NULL, &attributes, attributes_mask);
     }
   
-  ((GdkWindowPrivate *)widget->window)->window_type = GDK_WINDOW_TOPLEVEL;
+  GDK_DRAWABLE_TYPE (window) = GDK_WINDOW_TOPLEVEL;
   gdk_window_set_user_data (widget->window, window);
 
   widget->style = gtk_style_attach (widget->style, widget->window);
index 7900e2ae6e3e3f341ffa42696f8afcdf822dbd37..35693a68beb035b977e74ea7a543a16029d1b195 100644 (file)
@@ -4784,7 +4784,8 @@ gtk_reset_shapes_recurse (GtkWidget *widget,
 
   private = (GdkWindowPrivate*) window;
 
-  if (private->destroyed)
+  /* FIXME: We do we need this check? */
+  if (GDK_DRAWABLE_DESTROYED (window))
     return;
   gdk_window_get_user_data (window, &data);
   if (data != widget)